OpenGL:缓冲区对象/着色器超出范围

时间:2017-03-25 17:36:31

标签: c++ opengl

我正在学习OpenGL,但我遇到了问题。

我知道OpenGL会将所有内存分配到GPU上,因此技术范围不应该成为问题吗?但是,当我尝试这样做时:

int SetUpVertexShader(){
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    //BUILD AND COMPILE SHADER
    //VERTEX SHADER
    GLuint vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    //snip - code to compile shader, etc etc
    }


};

int SetUpFragmentShaderandLink(){
    //BUILD AND COMPILE SHADER
    //FRAGMENT SHADER
    GLint success;
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    //snip - code to compile shader, etc etc

};

int linkShaders(){
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader); //this line has complaints saying vertexShader is an undeclared identifier
    glAttachShader(shaderProgram, fragmentShader); // this line also has complaints saying fragmentShader is an undeclared identifier
    //the rest of the lines all have undeclared identifier complaints
    glLinkProgram(shaderProgram);
    //check linking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if(!success){
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED" << infoLog << std::endl;
    }
};

然后,一旦我到达链接着色器和程序函数linkShaders,我得到的投诉是顶点着色器和片段着色器超出范围(更具体地说,我被告知这两个是&#34;未声明的标识符&#34 )。如果这些是在GPU上分配的,而不是在堆栈上,那么为什么我被告知它们超出了范围?我做错了吗?

2 个答案:

答案 0 :(得分:0)

您的变量需要在范围内使用它们(无论是否涉及OpenGL,都是如此)。

glCreateShaderglCreateProgram返回以及glAttachShaderglLinkProgram使用的是句柄(用于特定目的的唯一标识符)到OpenGL对象。当您需要将它们提供给其他OpenGL调用时,请确保将它们保存在可以访问它们的位置(特别是如果您不再需要最初请求的资源,则可以使用清理功能)。

答案 1 :(得分:-1)

问题不在于内存本身超出范围,因为GPU内存遵循堆模式,而变量超出范围的变量只能在堆栈模式中发生。

问题在于存储在CPU内存中的指向此内存的指针位于堆栈中并超出范围。因此,您只需在函数体外声明您的GLuint指针。

相关问题