0
我創建了一個將3D數據繪製爲曲面的程序。定義3點照明[鍵/返回/填]與使用gllightfv和glmaterialfv照明vbo
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glLightfv(GL_LIGHT2, GL_DIFFUSE, light_grey);
glLightfv(GL_LIGHT1, GL_AMBIENT, amb_level);
後來提請使用
glBegin(GL_TRIANGLES);
glColor4f(ct.v1.r,ct.v1.g,ct.v1.b,a);
glNormal3f(ct.v1.nx,ct.v1.nz,ct.v1.ny);
glVertex3f(ct.v1.x, ct.v1.z, ct.v1.y);
glColor4f(ct.v2.r,ct.v2.g,ct.v2.b,a);
glNormal3f(ct.v2.nx,ct.v2.nz,ct.v2.ny);
glVertex3f(ct.v2.x, ct.v2.z, ct.v2.y);
glColor4f(ct.v3.r,ct.v3.g,ct.v3.b,a);
glNormal3f(ct.v3.nx,ct.v3.nz,ct.v3.ny);
glVertex3f(ct.v3.x, ct.v3.z, ct.v3.y);
glEnd();
表面和創建可愛點亮場景,但與混疊
....現在移到FFSA並現在使用VBOs ...將顏色和頂點數據以三角形爲基礎傳遞給簡單着色器
void draw_triangle2(c_triangle ct,bool f)
{
g_vertex_buffer_data[0][0]=ct.v1.x;
g_vertex_buffer_data[0][1]=ct.v1.z;
g_vertex_buffer_data[0][2]=ct.v1.y;
g_vertex_buffer_data[1][0]=ct.v2.x;
g_vertex_buffer_data[1][1]=ct.v2.z;
g_vertex_buffer_data[1][2]=ct.v2.y;
g_vertex_buffer_data[2][0]=ct.v3.x;
g_vertex_buffer_data[2][1]=ct.v3.z;
g_vertex_buffer_data[2][2]=ct.v3.y;
glBindBuffer(GL_ARRAY_BUFFER, my_gl_vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data[0][0])*9, g_vertex_buffer_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, my_gl_vertexbuffer);
glVertexAttribPointer(
0,
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
g_color_buffer_data[0][0]=ct.v1.r;
g_color_buffer_data[0][1]=ct.v1.g;
g_color_buffer_data[0][2]=ct.v1.b;
g_color_buffer_data[1][0]=ct.v2.r;
g_color_buffer_data[1][1]=ct.v2.g;
g_color_buffer_data[1][2]=ct.v2.b;
g_color_buffer_data[2][0]=ct.v3.r;
g_color_buffer_data[2][1]=ct.v3.g;
g_color_buffer_data[2][2]=ct.v3.b;
glBindBuffer(GL_ARRAY_BUFFER, my_gl_colorbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data[0][0])*9, g_color_buffer_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, my_gl_colorbuffer);
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0
);
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle
};
頂點着色器是
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColor;
out vec3 fragmentColor;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
fragmentColor = vertexColor;
}
片段着色器
#version 330 core
in vec3 fragmentColor;
out vec3 color;
void main(){
color = fragmentColor;
}
但是已經失去照明+正常傳遞。
拖網教程介紹了使用着色器計算光照的方法,我很高興使用固定的管道照明並保留glLighting代碼塊。並保持着色器簡單。
我需要做什麼?我可以創建第三個法線緩衝區 - 如果是的話,我如何將它們傳遞給固定管線?而在這兩個着色器中的哪一個?
感謝