2015-01-10 2 views
0

OpenGL에서 인터리브 된 버텍스 데이터를로드/할당하는 데 문제가 있습니다.OpenGL이 잘못되었습니다.

두 번째 특성을 설정할 때 INVALID_OPERATION이 계속 나타납니다.

편집 이것은 Mac에서만 발생합니다. Windows에서 INVALID_OPERATION 오류가 발생하지 않습니다. 그러나 나는 아래의 내용을 지금처럼 수정했다. Mac에서도 여전히 오류가 발생합니다.

 GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); 
     GL.VertexAttribPointer(shader.GetAttribLocation("position"), 3, VertexAttribPointerType.Float, false, _vertexStride, 0); 
     REngine.CheckGLError(); 
     GL.VertexAttribPointer(shader.GetAttribLocation("normal"), 3, VertexAttribPointerType.Float, false, _vertexStride, 12); 
     REngine.CheckGLError(); 
     GL.VertexAttribPointer(shader.GetAttribLocation("texcoord"), 2, VertexAttribPointerType.Float, false, _vertexStride, 24); 
     REngine.CheckGLError(); 
     GL.EnableVertexAttribArray(shader.GetAttribLocation("position")); 
     REngine.CheckGLError(); 
     GL.EnableVertexAttribArray(shader.GetAttribLocation("normal")); 
     REngine.CheckGLError(); 
     GL.EnableVertexAttribArray(shader.GetAttribLocation("texcoord")); 
     REngine.CheckGLError(); 

왜 그런가? 다른 사람들은 그것을하는 것처럼 보이고 훌륭하게 작동하지만, 나는 그것을 작동시키는 것처럼 보이지 않습니다.

내가 이전에에서 큐에 오래된 glErrors 있었다 밝혀

out vec4 color; 
void main() 
{ 
    color = vec4(1.0f,1.0f,1.0f,1.0f); 
} 

편집 :

layout(location=0) in vec3 position; 
layout(location=1) in vec3 normal; 
layout(location=2) in vec2 texcoord; 

out vec4 out_position; 
out vec4 out_normal; 
out vec2 out_texcoord; 


void main() { 
    out_normal = vec4(normal,1.0f); 
    out_position = vec4(position,1.0f); 
    out_texcoord = texcoord; 

} 

과 파편 : 여기

내 이에 대한 GLSL입니다 관로. 이전에 체크하고 glEnableClientState에 대한 호출을했는데, 4.2 컨텍스트를 사용하는 Mac에서 지원되지 않습니다. 전체 쉐이더 접근법으로는 더 이상 필요하지 않으므로 제거했습니다. 이렇게하면 오류가 수정되고 영광스러운 흰색 메쉬가 표시됩니다.

답변

3

활성 속성에만 위치 정보가 있습니다. normal 속성은 사용되지 않으므로 활성화되지 않습니다 (out_normal으로 전달하는 것은 무의미합니다. out_normal는 사용되지 않습니다). glGetAttributeLocation은 -1을 반환하지만 glVertexAttribPointer의 속성 색인은 GLuint이며 (GLuint)-1은 허용 된 속성 색인의 범위를 벗어납니다. texcoord에 대해서도 같은 오류가 발생합니다.

sizeof(float)glVertexAttribPointersize 매개 변수로 사용하는 것은 잘못되었습니다. 이 매개 변수는 특성 벡터에 대한 구성 요소의 수를 결정합니다. 1 (스칼라), 2d, 3d 또는 4d이며 일부 바이트 수가 아닙니다.

+0

나는 셰이더가 지시 한 것처럼 셰이더 개체에 0, 1, 2로 위치가 설정되어 있는지 확인했습니다. sizeof (float)에서 size와 같은 실제 값으로 변경하는 것은 도움이되지 않습니다. –

+1

무엇을 설정했는지 상관 없습니다. 해당 속성은 활성화되어 있지 않으므로 위치가 없습니다. 그럴리 없어. 셰이더에서 위치를 지정 했으므로'glGetAttribLocation'을 전혀 필요로하지 않습니다. 당신은 단순히 0, 1, 2를 사용할 수 있습니다. 오류는 발생하지 않습니다. 모든 숫자는 유효하지만'(GLuint) -1'은 유효하지 않습니다. – derhass

+0

실종 된 glErrors가 나왔다. 인터리브 된 데이터를 설정할 때까지 검사하지 않았다. 수표를 파이프 라인 위로 이동하고 Mac에서 지원되지 않는 이전 glEnableClientState 호출을 포착했습니다. 전체 쉐이더 접근 방식을 사용하기 때문에 실제로는 필요하지 않습니다. 그러나 나는 앞으로 나아가서 당신이 능동적 인 속성에 대해 실제로 맞으면서이 질문에 대답한다고 말 할 것입니다. –

관련 문제