2013-07-25 4 views
0

몇 년 동안 OpenGl을 보지 못했지만 이제는 새로운 스타일의 코드를 만들려고 노력하고 있지만 간단한 삼각형을 그리는 데 문제가 있습니다. 무엇보다도 좋은 예제와 함께 '라이브러리 지원'을 사용하지 않고 튜토리얼을 찾을 수는 없지만, 요점은 아닙니다. 아래 코드는 빨간색 삼각형을 그려야합니다. 대신이 코드는 흰색 삼각형을 그립니다. 내가 틀렸어? 당신이 inout으로 더 현대적인 쉐이더 구문을 사용하고 있지만, 다시 그 구문을 지원하지 않는 기본 1.10에서 수 있도록, 모든 쉐이더 버전을 선언되지 않은 : 내 마음에 오는깨끗한 xlib with opengl을 사용하여 쉐이더를 활성화하는 방법

dpy = XOpenDisplay(NULL); 
glxWin = generateXWindow(dpy); 

glEnable(GL_DEPTH_TEST); 
glShadeModel(GL_SMOOTH); 
glDepthFunc(GL_LESS); 

float points[] = { 
    0.0f, 0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
    -0.5f, -0.5f, 0.0f 
}; 

unsigned int vbo = 0; 
glGenBuffers (1, &vbo); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW); 

unsigned int vao = 0; 
glGenVertexArrays (1, &vao); 
glBindVertexArray (vao); 
glEnableVertexAttribArray (0); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL); 

const char* fragmet_shader = "out vec4 frag_colour; void main() { frag_colour = vec4 (0.7, 0.0, 0.7, 1.0); }"; 
const char* vertex_shader = "in vec3 vp; void main() { gl_Position = vec4 (vp, 1.0); }"; 

unsigned int vs = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vs, 1, &vertex_shader, NULL); 
glCompileShader(vs); 
unsigned int fs = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fs, 1, &fragmet_shader, NULL); 
glCompileShader(fs); 

unsigned int shader_program = glCreateProgram(); 
glAttachShader(shader_program, fs); 
glAttachShader(shader_program, vs); 
glLinkProgram(shader_program); 

glVertexPointer(3, GL_FLOAT, 0, NULL); 
glEnableClientState(GL_VERTEX_ARRAY); 

glClearColor(0.2, 0.2, 0.2, 1.0); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glUseProgram (shader_program); 
glBindVertexArray (vao); 
glDrawArrays (GL_TRIANGLES, 0, 3); 

glFlush(); 
glXSwapBuffers(dpy, glxWin); 
+0

경우'generateXWindow()'의 구현은? – genpfault

답변

0

한 가지. #version 130과 같은 전 처리기 지시문을 쉐이더 소스의 첫 번째 행으로 사용하십시오 (여기서는 개행 문자를 잊지 마십시오. 전 처리기 지시문에서 중요합니다).

또한 GL 오류 및 특히 쉐이더/프로그램의 컴파일 및 링크 상태를 확인하고 정보 로그를 쿼리해야합니다.