顶点着色器和原始模型的颜色

时间:2015-03-03 06:38:01

标签: opengl graphics glsl vertex-shader

我目前正在构建一个顶点着色器,以便在三维模型上围绕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);

1 个答案:

答案 0 :(得分:1)

您不能自己拥有顶点着色器。使用可编程管道时,您需要同时具有顶点着色器和片段着色器。

从OpenGL 3.3规范的第3.9节“片段着色器”:

  

当前使用的程序对象包含片段着色器时,其片段着色器被认为是活动的,并用于处理片段。如果程序对象没有片段着色器,或者当前没有使用程序对象,则片段着色器执行的结果未定义。

这意味着您必须添加片段着色器,以便可以使用顶点着色器。