我目前正在构建一个顶点着色器,以便在三维模型上围绕z轴执行非常简单的旋转。 3-D模型最初颜色很好。但是在我添加了我写的着色器之后,它搞砸了原来的颜色。我不明白为什么,因为我认为顶点着色器不应该触摸颜色部分。
我想要的只是变换顶点,同时颜色保持原始。
着色器在这里,我将其命名为#34; shader.cpp":
void main() {
float PI = 3.14159265358979323846264;
float angle = 45.0;
float rad_angle = angle*PI/180.0;
vec4 a = gl_Vertex;
vec4 b = a;
b.x = a.x*cos(rad_angle) - a.y*sin(rad_angle);
b.y = a.y*cos(rad_angle) + a.x*sin(rad_angle);
gl_Position = gl_ModelViewProjectionMatrix*b;
}
实际上,这只是从OpenGL GLSL的官方网站复制的一个非常简单的着色器。
我使用以下代码加载着色器,注意readShader(const char *)是一个读取文件shader.cpp内容的方法。这是非常微不足道的,所以我没有把它放在这里(很确定它工作正常):
void shading() {
GLuint shader, prog;
const GLchar * shaderText = readShader("shader.cpp");
shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(shader, 1, &shaderText, NULL);
glCompileShader(shader);
prog = glCreateProgram();
glAttachShader(prog, shader);
glLinkProgram(prog);
glUseProgram(prog);
}
然后,原始代码中有一个display()函数,用于构建3D图形。然后我在显示的前面添加了shading()函数()。像这样:
void display(void) {
shading();
//....
}
当然,GLUT lib函数将显示函数调用为:
glutDisplayFunc(display);
答案 0 :(得分:1)
您不能自己拥有顶点着色器。使用可编程管道时,您需要同时具有顶点着色器和片段着色器。
从OpenGL 3.3规范的第3.9节“片段着色器”:
当前使用的程序对象包含片段着色器时,其片段着色器被认为是活动的,并用于处理片段。如果程序对象没有片段着色器,或者当前没有使用程序对象,则片段着色器执行的结果未定义。
这意味着您必须添加片段着色器,以便可以使用顶点着色器。