2013-10-13 4 views
0

간단한 삼각형을 그릴 때 OpenGL 셰이더를 사용하려고합니다. 한 가지 중요한 렌더링 클래스 내에서 코드를 별도의 메서드로 분리하려고 시도했지만 화면에 렌더링 할 삼각형을 얻을 수없는 것 같습니다. 다른 방법은GLSL OpenGL 다각형이 렌더링되지 않습니다.

static const GLchar* vertexShaderSource[] = { 
    "#version 430 core       \n" 
    "in vec4 vPosition;       \n" 
    "in vec4 vColor;       \n" 
    "out vec4 color;       \n" 
    "           \n" 
    "void main() {        \n" 
    " color = vColor;       \n" 
    " gl_Position = vPosition;    \n" 
    "}           \n" 
}; 

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, 1, vertexShaderSource, NULL); 
glCompileShader(vertexShader); 

program = glCreateProgram(); 
glAttachShader(program, vertexShader); 
glLinkProgram(program); 

glDeleteShader(vertexShader); 

return program; 

내가 glewInit를 호출하고(), compileShaders() 다음 정점 배열과 버텍스 버퍼 오브젝트를 설정하고이 내 compileShaders() 내 쉐이더 소스 코드를 컴파일하고로드 방법이다. 이 메서드에서 triangleVertices [] 및 triangleColors []는 각 꼭지점의 삼각형에 대한 위치 (x, y, z)와 색상 값 (r, g, b, a)을 포함하는 두 개의 배열입니다.

glewInit(); 
renderingProgram = compileShaders(); 

glEnable(GL_ARRAY_BUFFER); 
glGenVertexArrays(1, &vertexArrayObject); 
glBindVertexArray(vertexArrayObject); 

glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, numberOfVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW); 

glBufferSubData(GL_ARRAY_BUFFER, 0, numberOfVertices*3*sizeof(GLfloat), triangleVertices); 
glBufferSubData(GL_ARRAY_BUFFER, numberOfVertices*3*sizeof(GLfloat), numberOfVertices*4*sizeof(GLfloat), triangleColors); 

GLuint vpos = glGetAttribLocation(renderingProgram, "vPosition"); 
glVertexAttribPointer(vpos, 3, GL_FLOAT, GL_FALSE, 0, 0); 

GLuint cpos = glGetAttribLocation(renderingProgram, "vColor"); 
glVertexAttribPointer(cpos, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numberOfVertices*3*sizeof(GLfloat))); 

glUseProgram(renderingProgram); 
glEnableVertexAttribArray(vpos); 
glEnableVertexAttribArray(cpos); 

마지막으로 내가 시도하는() 메소드를 렌더링 및 배열 버퍼에로드 된 삼각형을 그릴 수도있다 : 나는 다른 클래스의 설정이다는 Win32 창으로 렌더링하고

const GLfloat color[] = {0.0f, 0.0f, 1.0f, 1.0f}; 
glClearBufferfv(GL_COLOR, 0, color); 

glUseProgram(renderingProgram); 

glDrawArrays(GL_TRIANGLES, 0, 3); 
SwapBuffers(hDC_); 

. 렌더링 후 파란색 화면이 표시 될 수 있으므로 glClearBufferfv 호출이 제대로 작동하는 것처럼 보입니다. 그러나 내 삼각형은 어디에도 보이지 않습니다. 렌더링 모드를 glDrawArrays(GL_POINTS, 0, 1)으로 변경하면 화면 중간에 흰색 픽셀 하나가 나타납니다.

내가 뭘 잘못하고 있니? 다른 사람들이 지적했듯이

+3

실례지만, OpenGL 3.x에서는 셰이더 프로그램의 일부로 프래그먼트 셰이더가 필요하지 않습니까? 또한 버텍스 버퍼 코드를 게시하십시오. 당신은 도려내거나 극 소형 뷰포트로 렌더링하지 않습니다. – Raja

+1

'glLinkProgram (program);의 반환 값을 검사 해 보셨습니까? 프래그먼트 셰이더를 제공하지 않았기 때문에 실패 할까 봐 걱정됩니다. 또한 버텍스 쉐이더 소스가 이상하게 보입니다. – starrify

+0

방금 ​​시작한 이래로 다음을 살펴 보는 것이 좋습니다. http://arcsynthesis.org/gltut/Basics/Tutorial%2001.html 멋진 코드와 프레임 워크가 있습니다. 코드 (컴파일, 셰이더 연결 및 인쇄 오류 등) – Raja

답변

1

, 당신은

#version 430 

in vec4 color; 
out vec4 frag_rgba; // default index (0) (glFragBindDataLocation) 

void main (void) { 
    frag_rgba = color; 
} 

전에 연결에 버텍스 쉐이더와 함께 프로그램이 쉐이더를 부착, 예를 들면, 너무 조각 쉐이더가 필요합니다. 연결 후 프로그램의 쉐이더 detach을 사용할 수 있습니다. 버텍스 쉐이더에서 explicit attribute indices을 사용할 수도 있습니다.

+0

조각 쉐이더를 추가했는데 문제가 해결 된 것 같습니다. 또한 셰이더가'version 430 core '를 사용하여 제대로 컴파일되지 않은 것처럼 보입니다. 일단 내가 이것을'version 330 core'로 바꾸었다. 도움에 많은 감사드립니다. –