我目前正在构建一个顶点着色器来在三维模型上围绕z轴执行非常简单的旋转。 3D模型原本颜色很好。但是当我添加我写的着色器后,它将原始颜色搞乱了。我不知道为什么,因为我认为顶点着色器不应该触摸颜色部分。顶点着色器和原始模型的颜色
我想要的只是转换顶点,并在同一时间,颜色保持原来的。
着色器是在这里,我将其命名为“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);
}
然后,有原代码显示()函数,它建立了3D图形。然后在display()的前面添加shading()函数。就像这样:
void display(void) {
shading();
//....
}
当然的显示功能是由过剩的lib函数称为:
glutDisplayFunc(display);
与您的问题无关,但为什么当它不是C++源文件时称为shader.cpp? – immibis 2015-03-03 07:30:42
另外,您正在使用哪种OpenGL版本? – immibis 2015-03-03 07:31:11
我认为你必须通过如下方式将颜色信息从VS传递到FS:'gl_FrontColor = gl_Color;'(在VS中) – 2015-03-03 07:44:30