GLSL Error: (0) : error C5145: must write to gl_Position
GLSL Error: (0) : error C5145: must write to gl_Position
当我转到 link 我编译的顶点和片段着色器时,我得到这个错误:
(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
找到了这个)。
我该如何解决?
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
这为顶点着色器创建了一个着色器对象。这意味着 vertexShader
现在包含该着色器对象。鉴于:
glShaderSource(GL_VERTEX_SHADER, 1, &vertexShaderCode, nullptr);
这是做什么的?它应该将给定的代码放入着色器对象中。但是 none 的参数 是一个着色器对象 。第一个参数是 OpenGL 枚举器,它不是着色器对象。
着色器和程序对象与大多数 OpenGL 对象不同。您不只是为了将数据设置到它们中而绑定它们(制服和程序除外,但自 GL 4.1 以来我们甚至不需要为此绑定它们)。如果你想操纵一个着色器,你必须实际将着色器传递给操纵它的函数。
glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);
当我转到 link 我编译的顶点和片段着色器时,我得到这个错误:
(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
找到了这个)。
我该如何解决?
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
这为顶点着色器创建了一个着色器对象。这意味着 vertexShader
现在包含该着色器对象。鉴于:
glShaderSource(GL_VERTEX_SHADER, 1, &vertexShaderCode, nullptr);
这是做什么的?它应该将给定的代码放入着色器对象中。但是 none 的参数 是一个着色器对象 。第一个参数是 OpenGL 枚举器,它不是着色器对象。
着色器和程序对象与大多数 OpenGL 对象不同。您不只是为了将数据设置到它们中而绑定它们(制服和程序除外,但自 GL 4.1 以来我们甚至不需要为此绑定它们)。如果你想操纵一个着色器,你必须实际将着色器传递给操纵它的函数。
glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);