2014-05-10 61 views
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(); 

表面和創建可愛點亮場景,但與混疊

 3 point lighting

....現在移到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代碼塊。並保持着色器簡單。

我需要做什麼?我可以創建第三個法線緩衝區 - 如果是的話,我如何將它們傳遞給固定管線?而在這兩個着色器中的哪一個?

感謝

回答

1

你有兩個選擇:

  1. 在自己的着色器實現照明計算。
  2. 堅持固定管道。

您不能使用自己的着色器,並仍然利用固定功能的照明功能。

我通常會推薦選項1,因爲固定管線在覈心OpenGL中已被棄用,並且使用自己的着色器增加了很多靈活性。但是如果你之前沒有做過着色器編程,肯定會有一些學習曲線。如果你還沒有準備好跳轉,那麼你可以很容易地使用你以前的固​​定管道代碼與VBOs。您需要更改的主要內容:

  • 爲您創建另一個VBO法線,就像您對位置和顏色所做的一樣。或者將所有三個屬性交織在同一個VBO中。
  • 代替glVertexAttribPointer()glEnableVertexAttribArray(),使用它們的等同物用於固定功能屬性:glVertexPointer()glNormalPointer()glColorPointer()glEnableClientState(GL_[VERTEX|NORMAL|COLOR]_ARRAY)