2012-11-29 2 views
0

매우 간단한 GLFW 및 VBO 예제를 실행하려고하는데 막혔습니다. 나는 glBeginglEnd을 다른 프로젝트에 사용했지만 OpenGL ES 2에서 작동하도록 코드를 업데이트하려고하지만 가능한 한 앞으로 호환되도록하려고합니다.간단한 VBO 예제의 문제

#include <stdlib.h> 
#include <GL/glfw3.h> 
#include <stdio.h> 

#define bool int 
#define true 1 
#define false 0 

const int width = 800; 
const int height = 600; 
bool opened = true; 

GLuint glTriangle; 
GLfloat triangle[] = { 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
}; 

void init() { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    glGenBuffers(1, &glTriangle); 
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); 
} 

void display() { 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle); 

    glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 
} 

int windowClose(GLFWwindow window) { 
    opened = false; 
    return GL_TRUE; 
} 

void main() { 
    if (!glfwInit()) { 
     printf("glfwInit didn't work\n"); 
     return; 
    } 

    GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0); 
    glfwMakeContextCurrent(window); 

    init(); 

    glfwSetWindowCloseCallback(window, windowClose); 

    glfwSwapInterval(1); 

    while(opened) { 
     display(); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 
    glfwTerminate(); 
} 

이 코드를 실행,하지만 난 흰색 삼각형을 볼 것으로 예상 할 때 내가 할 모든 검은 화면입니다 : 온라인 몇 가지 예에서

, 나는 다음과 같은 코드로 왔어요. 적어도 스크린에 페인트 칠할 때까지는 쉐이더/텍스처와 같은 멋진 것을 피하려고했습니다.

중요한 경우, Linux에서 OpenGL 버전 2.1을 사용하여 Mesa 드라이버를 사용하여 gcc -o test -lGL -lglfw -lm test.c을 컴파일 중입니다.

내가 뭘 잘못하고 있니? 색상 정보를 지정해야하는 경우,이를 수행하는 간단한 방법은 무엇입니까?

답변

2

고정 파이프 라인에는 glEnableVertexAttribArray/glVertexAttribPointer을 사용하지 않아야합니다. 그것은 일할 수도 있습니다 (나는 긍정적이지 않다, 나는 attrib 0이 정점 attrib 배열에 별칭이 될 수 있다고 생각하지만 확실하지는 않다). 그렇게하는 것은 사실이 아닙니다.

셰이더가없는 경우 꼭지점 데이터에 glEnableClientStateglVertexPointer을 사용해야합니다.

기본 색상은 (1,1,1,1)이므로 지금 색상을 확인해야합니다.

+0

'glEnableClientState' 및'glVertexPointer'가 사용되지 않습니다. 그래서 다른 두 사람을 사용했습니다. – tjameson

+1

@tjameson : 아니요. 그들은 * 제거 *, 더 이상 사용되지 않습니다. 나머지 고정 기능 파이프 라인도 마찬가지입니다. 비 핵심 3.1+ OpenGL 기능에 의존하려면 렌더링 할 쉐이더가 필요합니다. –

+0

다음은이 질문에 대한 최상의 답변입니다. 나는 셰이더를 계산하기로 결정했다. (사실 너무 어렵지는 않았다.) 이제는 작동 중이다. 감사합니다 @ NicolBolas, 정확히 내가 찾고 있었던 것이 었습니다. – tjameson