GLSL错误:(0):错误C5145:必须写入gl_Position

时间:2017-05-15 03:13:32

标签: c++ opengl glsl shader linker-errors

当我转到链接我编译的顶点和片段着色器时,我收到此错误:

(0) : error C5145: must write to gl_Position

以下是发生错误的代码的基本部分:

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(GL_VERTEX_SHADER, 1, &vertexShaderCode, nullptr);
glCompileShader(GL_VERTEX_SHADER);
GLint okay;
glGetShaderiv(GL_VERTEX_SHADER, GL_COMPILE_STATUS, &okay);
if (okay == GL_FALSE) {
    char infoLog[512];
    glGetShaderInfoLog(GL_VERTEX_SHADER, 512, nullptr, infoLog);
    error("Failed to compile vertex shader.", infoLog);
}

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(GL_FRAGMENT_SHADER, 1, &fragmentShaderCode, nullptr);
glCompileShader(GL_FRAGMENT_SHADER);
glGetShaderiv(GL_FRAGMENT_SHADER, GL_COMPILE_STATUS, &okay);
if (okay == GL_FALSE) {
    char infoLog[512];
    glGetShaderInfoLog(GL_FRAGMENT_SHADER, 512, nullptr, infoLog);
    error("Failed to compile fragment shader.", infoLog);
}

GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &okay);
if (okay == GL_FALSE) {
    char infoLog[512];
    glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
    error("Failed to link the shader program.", infoLog);
}

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

这是顶点着色器:

#version 330 core
layout (location = 0) in vec3 vertexData;
layout (location = 1) in vec2 textureCoord;
out vec2 textCoord;
uniform mat4 projectionMat;
uniform mat4 viewMat;
uniform mat4 modelMat;
void main() {
    gl_Position = projectionMat * viewMat * modelMat * vec4(vertexData, 1.0f);
    vertColor = vertexColor;
    textCoord = textureCoord;
}

这是片段着色器(,如果重要):

#version 330 core
in vec2 textCoord;
out vec4 color;
uniform sampler2D text;
uniform vec4 textColor;
void main() {
    color = texture(text, textCoord) * textColor;
}

我做了一些调查并玩弄了它,并发现(与其他人不同)我发送给OpenGL的来源是为空并且是完整的,正确的来源(我通过打印发现了这个 vertexShaderCode)。

我该如何解决?

1 个答案:

答案 0 :(得分:4)

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

这将为顶点着色器创建着色器对象。这意味着vertexShader现在包含着色器对象。鉴于:

glShaderSource(GL_VERTEX_SHADER, 1, &vertexShaderCode, nullptr);

这是做什么的?它应该将给定的代码放入着色器对象。但是参数都不是着色器对象。第一个参数是OpenGL枚举器,它不是着色器对象。

着色器和程序对象与大多数OpenGL对象不同。你没有绑定它们只是为了将数据设置到它们中(制服和程序除外,但我们甚至不需要为它们绑定它们,因为GL 4.1)。如果要操作着色器,则必须将着色器实际传递给操作它的函数。

glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);