2015-02-17 73 views
0

我一直在嘗試爲我的OpenGL項目實現燈光,但到目前爲止我還沒有能夠獲得任何燈光效果。未在OpenGL中出現燈光

我知道很多事情可能會出錯,所以我試着硬編碼我的法線(只使用幾個三角形),但仍然沒有得到任何東西。

在我的場景中,我有一些物體沿0,0,0的「地面」放置,希望看到光線從上面落下。他們有一個非常基本的紋理,很容易顯示它們是否點亮。

我初始化我的場景是這樣的:

glEnable(GL_CULL_FACE); 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 
glShadeModel(GL_SMOOTH); 
glEnable(GL_COLOR_MATERIAL); 

glTranslatef(0,0,0); 
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 0.2f }; 
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f }; 
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
GLfloat position[] = {0, 100.0f, 0, 1.0f }; 

glLightModelfv(GL_AMBIENT, ambientLight); 
glLightModelfv(GL_DIFFUSE, ambientLight); 
glLightModelfv(GL_SPECULAR, specularLight); 
glLightModelfv(GL_POSITION, position); 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); 
glLightfv(GL_LIGHT0, GL_POSITION, position); 

glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 

GLfloat shine [] = {50}; 
GLfloat diffuse[] = {1.0f, 0.f, 0.f, 1.0f}; 
GLfloat spec[] = {1.0f, 0.f, 0.f, 1.0f}; 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,diffuse); 
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,spec); 
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,shine); 

當我去渲染:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tiles[x]->image.width(), tiles[x]->image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tiles[x]->image.bits()); 
    glNormal3d(0,1,0); //Will eventually calculate  
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDrawArrays(GL_TRIANGLES, 3, 3); 

「磚」就是一個類礦井保存的圖像和相應的向量我對象。在「頂點」被稱爲僅僅是一個載體的名單(所以每個對象都有6個向量= 2個三角形

我的片段着色器:

uniform sampler2D texture; 
in vec4 gl_Color; 
in vec2 varyingTextureCoordinate; 

out vec4 fragColor; 

void main(void) 
{ 
    fragColor = texture2D(texture, varyingTextureCoordinate); 
} 

我的頂點着色器:

uniform mat4 mvpMatrix; 

in vec4 vertex; 
in vec2 textureCoordinate; 

out vec2 varyingTextureCoordinate; 

void main(void) 
{ 
    varyingTextureCoordinate = textureCoordinate; 
    gl_Position = mvpMatrix * vertex; 
} 

由於與紋理的衝突,我的照明缺乏嗎?無論我如何改變這種正常狀態,我都沒有得到任何照明。

+0

這是固定函數和着色器代碼的公然混合,沒有指出着色器*的內容,發佈了[MCVE](http://stackoverflow.com/help/mcve)。 – genpfault 2015-02-18 03:55:24

+0

哎呀,我的意思是包括我的着色器,現在把它們放好。 – Yattabyte 2015-02-18 04:02:46

+0

還剩下,意味着擺脫那。在我真正學會如何自己計算法向量之前。它不會導致問題 – Yattabyte 2015-02-18 04:38:27

回答

3

我認爲你想在這裏結合預先編程的shader opengl和shader open gl。我建議學習如何利用盡可能多的着色器代碼儘可能

BennyBox實現照明對OpenGL覆蓋着色器有很大的YouTube系列發動機設計

這裏是他git repojava version