我目前正在構建一個頂點着色器來在三維模型上圍繞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