2013-07-02 2 views
0

스피 (VAO를 사용하지 않고) 오직 버텍스 버퍼 오브젝트를 사용하여 하나의 삼각형을 그릴 수있는 작은 OpenGL을 프로그램을 작성하려고들하지만, 그것은 단지내가 컴파일 할 때마다

여기에 블루 스크린을 보여줍니다 VBO에 OpenGL 그리기 내 코드

#include <iostream> 
#include <GLUT/glut.h> 
#include <OpenGL/gl3.h> 

GLuint VBO; 
GLuint VAO; 

void display(); 

float vertex[] = {-1.0, 0.0 , 0.0, 
        0.0 , 1.0 , 0.0 , 
        1.0 , 0.0 , 0.0 }; 

int main (int argc, char *argv[]) 

{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE); 
glutInitWindowSize(1000, 400); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("My First GLUT/OpenGL Window"); 
glutDisplayFunc(display); 
glutMainLoop(); 
return 0; 
} 

void display() 

{ 
glClearColor(0, 0, 1,1); 
glClear(GL_COLOR_BUFFER_BIT); 

glGenBuffers(1,&VBO); 
glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER,9 *sizeof(vertex),vertex, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 

glVertexAttribPointer(0, 3,GL_FLOAT, GL_TRUE, 0, 0); 


glDrawArrays(GL_TRIANGLES, 0, 3); 

glDisableVertexAttribArray(0); 

glutSwapBuffers(); 
}; 
+0

쉐이더는 어디에 있습니까? glVertexPointer()를 사용하지 않는 이유는 무엇입니까? – genpfault

+0

Iam OpenGL 프로그래밍에 익숙하지 않고 OpenGL을 사용하여 여러 가지 드로잉 방법을 탐험 해 보았으므로 (프로그램의 모든 부분을 다루지는 못했지만) 온라인 자습서를 따르면서이 코드를 만들었습니다. 쉐이더 프로그램 .. – BulBul

답변

2

세 가지 문제가 있습니다 :

  • 귀하의 코드 윈도우가 0 × 0의 크기로 생성 될 일 이후에만 전을 끌어다 경우 (뷰포트를 설정 그리워 nitial 뷰포트 크기는 0 × 0이됩니다).

  • sizeof 연산자를 잘못 사용했습니다. vertex은 정적으로 할당 된 배열이므로 sizeof 연산자는 정점 배열의 전체 크기를 반환합니다 .nout은 단일 요소의 크기입니다. 그래서 특별한 경우에 단지 sizeof(vertex)에 9를 곱하지 않고도 충분할 것입니다.

그리고 마지막으로, 그리고 문제의 진정한 원인 :

쉐이더는
  • ? 일반 정점 속성을 사용하고 물론 OpenGL-3에서 의무적으로 사용하는 정점 및 프래그먼트 셰이더의 유효한 조합을 제공해야합니다. 그것들이 없으면 아무 것도 렌더링되지 않을 것입니다.
+0

실제로 저는 인터넷 자습서에서 이러한 모든 문제를 보았습니다. sizeof 연산자에 상수를 곱하는 자습서가 있습니다. 쉐이더에 관해서는 이미 그 꼭지점과 조각 쉐이더가 필수라는 것을 알고 있지만 전에 언급했듯이 프로그램의 모든 측면을 언급하지 않은 온라인 자습서입니다. 쉐이더를 지정하지 않아서 생각했습니다. OpenGl에 단순 쉐이더 셰이더와 같은 일종의 기본 쉐이더 프로그램을 사용하게했습니다. P, 어쨌든 고맙습니다. 당신의 대답을 위해서 .. – BulBul

+0

@BulBul : OpenGL에는 기본 쉐이더가 없습니다. OpenGL-2를 사용하고 비 일반 정점 속성 (glVertexPointer, glNormalPointer, glEnableClientState (GL_VERTEX_ARRAY) 등)을 사용하면 고정 함수 파이프 라인을 기본값으로 사용할 수 있습니다. sizeof 연산자에 관해서, 나는 당신이'sizeof (v [0])'또는'sizeof (* v)'와 같은 것을 쓴 것과 정적으로 할당 된 배열이 아닌 포인터에 대해 작업했다고 언급했다. 이 미묘함에 대해 알지 못했기 때문에 C/C++ 지식을 연마하는 것이 좋습니다. – datenwolf

+0

내가 읽은 C 프로그래밍 서적 중 하나의 정의에서 >>> 배열의 이름 (색인을 지정하지 않고)은 해당 배열의 첫 번째 요소에 대한 포인터입니다. 예 : "vertex"와 같습니다. "vertex [0]"하지만 sizeof() 연산자는 예상했던 것보다 완전히 다른 방식으로 작동합니다. – BulBul

관련 문제