繁体   English   中英

GL_UseProgram不会影响着色器

Gl_UseProgram doesn't affect shaders

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

看来我的useProgram没有绑定着色器,所以我无法为其设置统一。 但是,当我在着色器的编译代码中使用GlUseProgram时,我可以设置制服。 我正在使用一个资源管理器来处理着色器和纹理,并使用一个Game文件来处理着色器/文本器/游戏设置。

Shader.h:

class Shader
{
    Shader() {};
    void Compile(const std::string& vertexSource, const std::string& fragmentSource, const char* geometrySource = nullptr);
    Shader  &Use();
}

Shader.cpp

Shader & Shader::Use()
}
    glUseProgram(this->ID);
    return *this;
{

void Shader::Compile(const std::string& vertexSource, const std::string& 
    fragmentSource, const char* geometrySource)
{
    unsigned int vShader, fShader, gShader;

    const char* src1 = vertexSource.c_str();
    const char* src2 = fragmentSource.c_str();

    vShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vShader, 1, &src1, NULL);
    glCompileShader(vShader);
    checkCompileErrors(vShader, "VERTEX");

    fShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fShader, 1, &src2, NULL);
    glCompileShader(fShader);
    checkCompileErrors(fShader, "FRAGMENT");

    if (geometrySource != nullptr)
    {
        gShader = glCreateShader(GL_GEOMETRY_SHADER);
        glShaderSource(gShader, 1, &geometrySource, NULL);
        glCompileShader(gShader);
        checkCompileErrors(gShader, "error");
    }

    this->ID = glCreateProgram();
    glAttachShader(this->ID, vShader);
    glAttachShader(this->ID, fShader);

    if (geometrySource != nullptr)
    {
        glAttachShader(this->ID, gShader);
    }
    glLinkProgram(this->ID);
    checkCompileErrors(this->ID, "PROGRAM");

    //glUseProgram(this->ID);

    glDeleteShader(vShader);
    glDeleteShader(fShader);
    if (geometrySource != nullptr)
    {
        glDeleteShader(gShader);
    }
}

您可以看到我在哪里注释掉了GlUseProgram。 如果我不对其进行注释,则着色器将正常工作,但如果对它进行注释,则它将不起作用。

ResourceManager.h:

class ResourceManager
{
public:
    // Resource storage
    static std::unordered_map<std::string, Shader>    shader;
    static Shader loadShader(const std::string& vShaderSource, std::string filename);
    static Shader getShader(std::string name);
    static Shader loadShaderFromFile(const std::string& vShaderFile);

ResourceManager.cpp

std::unordered_map<std::string, Shader> ResourceManager::shader;
Shader ResourceManager::loadShader(const std::string& vShaderSource, std::string filename)
{
    shader[filename] = loadShaderFromFile(vShaderSource);
    return shader[filename];
}

Shader ResourceManager::getShader(std::string filename)
{
    return shader[filename];
}

Shader ResourceManager::loadShaderFromFile(const std::string& vShaderFile)
{
    enum class ShaderType
    {
        none = -1, vertex = 0, fragment = 1
    };

    std::fstream path(vShaderFile);
    std::stringstream ss[2];
    std::string string;
    ShaderType type = ShaderType::none;

    while (std::getline(path, string))
    {
        if (string.find("shader") != std::string::npos) 
        {
            if (string.find("vertex") != std::string::npos)
            {
                type = ShaderType::vertex;
            }
            if (string.find("fragment") != std::string::npos)
            {
                type = ShaderType::fragment;
            }
        }
        else
            ss[(int)type] << string << "\n";
    }

    std::string vertexCode = ss[0].str();
    std::string fragmentCode = ss[1].str();
    const char* geomtryCode = nullptr;

    Shader shader;
    shader.Compile(vertexCode, fragmentCode);

    return shader;
}

最后。 Game.cpp:

void Game::Init()
{
    ResourceManager::loadShader("res/Shader/shader.shader", "sprite");
    ResourceManager::getShader("sprite").Use().setUniform1i("image", 0);
    ResourceManager::getShader("sprite").setUniformMatrix4fv("projection", projection);
}

有人可以解释为什么它似乎不起作用吗?

1 个回复

4.6规范 7.1节中有关DeleteShader()它仅表示:

如果着色器未附加到任何程序对象,则将其立即删除。 否则,着色器将标记为删除,并且在不再附加到任何程序对象时将被删除。

在7.3节中,关于UseProgram()

如果程序尚未成功链接,则会生成INVALID_OPERATION错误。 当前渲染状态未修改。

使用程序对象时,应用程序可以自由修改附加的着色器对象,编译附加的着色器对象,附加其他着色器对象以及分离着色器对象。 这些操作不会影响程序对象的链接状态或可执行代码。

您会看到,显然,在成功链接之后,您可以在任何地方调用glUseProgram()
如果对您不起作用,则可能是gfx卡驱动程序中的错误。

但是请再次阅读并注意它会告诉您分离着色器,而不是删除着色器。

简而言之,请先删除着色器( glDetachShader ),然后再将其删除( glDeleteShader )。

2 WebGL帧缓冲区:gl.clearColor似乎不会影响FBO中的Alpha通道

我正在尝试将某些内容从OpenGl移植到WebGL。 我发现由于某种原因,当从我的帧缓冲区中调用gl.clearColor(0,0,0,0)似乎根本没有改变alpha值,这与尝试在main上调用该函数相反backbuffer,可以正确呈现透明的backbuffer。 我相信我在Fbo上正 ...

3 为什么CG着色器不能与GL 3.2一起使用?

我已经尽一切努力使OpenGL 3.2在游戏引擎中使用CG着色器进行渲染,但是我没有运气。 所以我决定做一个最小的项目,但着色器仍然无法使用。 从理论上讲,我的测试项目应该只渲染一个红色三角形,但是它是白色的,因为着色器没有做任何事情。 我将代码发布在这里: #include &lt ...

4 Open GL Shaders“重用”

我的问题基于此答案GLSL可重用/共享的功能,共享的常量(OpenGL ES 2.0)? 如果可以创建通用的着色器,极限在哪里? 我可以在此通用着色器中编写Uniform变量吗? 我可以在特定的着色器上附加的最大通用着色器数量是多少? 增加此性能? 推荐吗? 任何人都经历过吗 ...

5 SHIFT不影响%*

我正在尝试将一些可选参数添加到批处理文件中但由于SHIFT命令不影响所有参数变量%*而遇到问题。 如果我必须使用%*有谁知道如何允许可选的批处理文件参数? 例如,一个简单的例子,仅使用和不使用换行符将屏幕上的参数打印出来,使用可选参数来确定: ...

6 为什么Xcode不能识别这些着色器?

我正在尝试自学Xcode,Objective-C,iOS应用程序开发和GLSL。 (可能不可取,我知道。;-)我一直在修改GLCameraRipple示例,到目前为止取得了很大的成功! 但是当我尝试创建一些新的顶点和片段着色器时,我今天感到难过。 该示例带有名为“Shader.vsh” ...

7 传递给着色器的颜色不起作用

我对OpenGL很陌生,并且有一个我目前正在使用的简单程序。 我遇到的问题是当我传递一个数组来表示点的颜色时,颜色最终变成了黑色。 如果我仅在片段着色器中明确定义颜色,并且在VAO中切换数据的索引,三角形将移动到作为颜色的点,则效果很好。 我尝试使用API​​跟踪并获得以下信息: ...

9 为什么着色器不包括构建?

我是 Unity 的新手,有些东西对我来说很奇怪。 我创建了一个UnlitTextureYUV.shader文件,然后像这样在我的脚本中使用它 然后在编辑器中我点击运行按钮,我看到一切正常,好的。 然后我点击File-&gt;Build&amp;Run并且我得到一个错误ArgumentNullE ...

2020-10-29 11:40:46 1 175   unity3d
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM