2013-05-16 2 views
0

GL_UNSIGNED_INT_2_10_10_10_REV와 함께 glVertexAttribP를 사용하려고했지만 어느 시점에 고생했습니다.glDrawArray에서 액세스 위반이 발생했습니다.

여기 내 코드

GLuint red=0,green=511,blue=511,alpha=3; 
GLuint val = 0; 

val = val | (alpha << 30); 
val = val | (blue << 20); 
val = val | (green << 10); 
val = val | (red << 0); 
GLfloat vertices[]={-0.9f, -0.9f, 0.0f,1.0f, 
     -0.9f, 0.6f, 0.0f,1.0f, 
     0.6f,0.6f,0.0f,1.0f, 
     0.6f,-0.9f,0.0f,1.0f}; 

GLuint test_data[]={val,val,val,val}; 
glGenBuffers(1, &BufferId); 
glBindBuffer(GL_ARRAY_BUFFER, BufferId); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

glEnableVertexAttribArray(glGetAttribLocation(shader_data.psId,"position")); 
glVertexAttribPointer(glGetAttribLocation(shader_data.psId,"position"),4,GL_FLOAT,GL_FALSE, 0,0); 

glGenBuffers(1, &BufferId1); 
glBindBuffer(GL_ARRAY_BUFFER, BufferId1); 
glBufferData(GL_ARRAY_BUFFER, sizeof(test_data), test_data, GL_STATIC_DRAW); 

glEnableVertexAttribArray(glGetAttribLocation(shader_data.psId,"color")); 
//glVertexAttribPointer(glGetAttribLocation(shader_data.psId,"color"), 4,GL_INT_2_10_10_10_REV,GL_TRUE, 0,0); 
     glVertexAttribP4uiv(glGetAttribLocation(shader_data.psId,"color"),GL_UNSIGNED_INT_2_10_10_10_REV ,GL_TRUE,0); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

가 glDraw 통화에서 액세스 위반을 제공합니다. 코드 glVertexAttribPointer 잘 작동합니다. 나는 무엇을 여기에서 놓치고 있냐?

답변

2

glEnableVertexAttribArray (glGetAttribLocation (shader_data.psId, "color")));

이것은 당신의 속성 데이터의 소스로 배열를 사용하는 OpenGL을 알려줍니다. 그러나 당신은 그렇지 않습니다. 따라서 충돌 : OpenGL은 존재하지 않는 배열에 액세스하려고 시도합니다.

배열을 사용하지 않도록 설정하십시오.

+0

빠른 대답을 주셔서 감사합니다. 이제 glEnableVertexAttribArray() 호출이 나머지를 동일하게 유지한다고 설명했습니다. 지금은 검은 색이 .. – debonair

0

sizeof (vertices) 및 sizeof (test_data)를 사용하면 올바른 크기를 얻을 수 있습니까?

콘텐츠의 크기 대신 포인터의 크기를 제공하는지 궁금합니다.

범위 문제 일 수 있습니다.

관련 문제