2012-07-16 2 views
0

OpenGL 3.2에서 간단한 직사각형을 완성 했으므로 이제 조명 지원을 추가하고 싶습니다. 그러나 프래그먼트 셰이더로 내 법선을 이동하려고 할 때마다 아무 것도 나타나지 않습니다. 그 줄을 주석 처리하면, 그것은 완벽하게 다시 작동합니다. 이것을 일으키는 원인은 무엇입니까? 오류 로그에 아무 것도 나타나지 않습니다.버텍스 쉐이더에서 변수 설정시 빈 화면 얻기

버텍스 쉐이더 :

#version 150 

in vec4 position; 
in vec3 inNormal; 

out vec3 varNormal; 

uniform mat4 modelViewProjectionMatrix; 

void main() 
{ 
    //varNormal = inNormal; //If I uncomment this line, nothing shows up  
gl_Position = modelViewProjectionMatrix * position; 
} 

조각 쉐이더 :

#version 150 

in vec3 varNormal; 

out vec4 fragColor; 

void main() 
{ 
fragColor = vec4(1, 1, 1, 1); 
} 

그리고 통과하는 법선 :



GLuint posAttrib = 0; 
GLuint normalAttrib = 1; 

glBindAttribLocation(program, posAttrib, "position"); 
glBindAttribLocation(program, normalAttrib, "normalAttrib"); 

//Building the VAO's/VBO's 
GLfloat posCoords[] = 
{ 
    -10, 0.0, -10, 
    -10, 0.0, 10, 
    10, 0.0, 10, 
    10, 0.0, -10, 
}; 

GLfloat normalCoords[] = 
{ 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1 
}; 

glGenVertexArrays(1, &vaoName); 
glBindVertexArray(vaoName); 

GLuint posBuffer; 
glGenBuffers(1, &posBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, posBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(posCoords), posCoords, GL_STATIC_DRAW); 
glEnableVertexAttribArray(posAttrib); 
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0); 

GLuint normalBuffer;   
glGenBuffers(1, &normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(normalCoords), normalCoords, GL_STATIC_DRAW); 
glEnableVertexAttribArray(normalAttrib); 
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0); 

내가 내 위치 및 일반 좌표의 모든 퍼팅 시도하지 않은 하나의 VBO지만, 나는 그 방법에 의지하지 않는 것을 선호한다.

+0

그들은 이미 문자열 배열을 사용하여 선언되었으므로 필요하지 않다고 생각하여 코드 조각에 포함하지 않았습니다. 그리고 사복과 유니폼은 서로 다른 두 가지가 아닌가? – TheAmateurProgrammer

답변

0

아마도이 문제를 해결하는 가장 기괴한 이유 일 수도 있지만 작동합니다.

먼저 OpenGL Profiler가 어떻게 작동하는지 확인하십시오. glDrawElements (또는 glDrawArray가 사용중인 내용에 따라) 후

http://f.cl.ly/items/3A1R2Q3I472m2q3J1J3x/Screen%20Shot%202012-10-14%20at%202.46.26%20PM.png

그런 속성 프로그램의 정점을보고 있는지 위치를하기 전에/중단 점을 설정 Apple Docs

에서 제공하는 튜토리얼이있다 순서대로입니다.

http://f.cl.ly/items/0f3c2G31113I2P1j3G3M/Screen%20Shot%202012-10-14%20at%202.47.24%20PM.png

그렇지 않은 경우, 다시 정렬. 에서

(또는 다른 것) :

enum 
{ 
POSITION_ATTR = 0, 
TEXTURE_ATTR=1, 
NORMAL_ATTR=2, 
}; 

사람 :

enum 
{ 
NORMAL_ATTR = 0, 
TEXTURE_ATTR=2, 
POSITION_ATTR=1, 
}; 

아니 생각이 어떻게 그리고 왜 이런 일이 있지만,이 문제에 대한 솔루션입니다.

1

이것이 실제 코드인지 또는 잘라 내기 및 붙여 넣기인지 확실하지 않지만 glBindAttribLocation을 호출하면 다음에 glLinkProgram을 호출 한 후에 만 적용됩니다.

glBindAttrib를 호출 한 후에 프로그램을 연결하지 않으면 해당 항목이 적용되지 않으며 속성에 잘못된 색인이 제공 될 수 있습니다. 그러면 정상적인 행의 주석 처리를 제거한 후 다른 행동을하게되는 이유를 설명 할 수 있습니다.

+0

그냥 잘라내어 여기에 붙여 넣어 내 질문에 댓글을 달았습니다. 내 질문에 더 많은 내용을 추가해야한다고 말했지만 그때 그의 코멘트를 삭제했습니다 ... – TheAmateurProgrammer

관련 문제