2017-02-20 1 views
0

iOS에서 OpenGL을 사용하여 삼각형을 렌더링하려고합니다. 내 환경 설정이 있습니다. 화면의 배경색을 변경할 수 있습니다. 나는 컴파일과 프로그램에 성공적으로 링크 된 기본적인 버텍스와 프래그먼트 쉐이더를 가지고있다. glError()도 오류를보고하지 않습니다.기본 삼각형 셰이더가 렌더링되지 않습니다.

내 삼각형이 렌더링되지 않습니다. 이 같은

I 설정 내 프레임 버퍼와 렌더링 버퍼 :

glGenRenderbuffers(1, &_colorRenderBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:drawable]; 

GLuint framebuffer; 
glGenFramebuffers(1, &framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
          GL_RENDERBUFFER, _colorRenderBuffer); 

가 그럼 난 내 삼각형의 세 꼭지점을 정의

_triangleMatrix[0] = -1.0; _triangleMatrix[1] = 0.0; 
_triangleMatrix[2] = 0.0; _triangleMatrix[3] = 1.0; 
_triangleMatrix[4] = 1.0; _triangleMatrix[5] = 0.0; 

내가 만들고 내 쉐이더를 연결합니다. 그런 다음

[self createVertexShader]; 
[self createFragmentShader]; 
[self linkProgram]; 

내가 프로그램을 사용하여 속성 "위치"슬롯을 얻고 활성화 : 나는 어떤 컴파일 또는 링크 오류를 얻을 수 없기 때문에 여기에 전체 코드를 보여 않을거야

glUseProgram(_program); 
_position_slot = glGetAttribLocation(_program, "position"); 
glEnableVertexAttribArray(_position_slot); 

이제 VBO를 설치해야합니다. 이것은 내가 가장 확신 할 수없는 부분입니다.

NSString* vshader = \ 
@"attribute vec2 position; \ 
void main()\ 
{\ 
    gl_Position = vec4(position.x, position.y, 0.0, 1.0);\ 
}"; 

그리고 조각 쉐이더 :

NSString* fshader = \ 
@"void main()\ 
{\ 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\ 
}"; 
다음
glClear(GL_COLOR_BUFFER_BIT); 

    // 1rst attribute buffer : vertices 
    glVertexAttribPointer(
          _position_slot, 
          2,     // size 
          GL_FLOAT,   // type 
          GL_FALSE,   // normalized? 
          0,     // stride 
          (void*)0   // array buffer offset 
         ); 
    // Draw the triangle ! 
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle 
    glDisableVertexAttribArray(0); 
    [_context presentRenderbuffer:GL_RENDERBUFFER]; 

컴파일 된 버텍스 쉐이더에 대한 코드입니다 : 여기에

glGenBuffers(1, &_vertex_buffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(_triangleMatrix), _triangleMatrix, GL_STATIC_DRAW); 

그리고 내 렌더링() 메소드의

그건 기본적으로, 전체 파일에 대한 https://gist.github.com/anonymous/6ed3f8231e76db35921ef260bfa6bf43

내 버텍스 쉐이더가 _triangleMatrix 멤버의 "위치"데이터를받지 못한다는 것을 알 수 있습니다. 따라서 속성이 올바르게 설정되지 않았거나 _triangleMatrix의 데이터 자체가 OpenGL에 의해 읽히지 않습니다. 어쨌든, 내가 본 모든 개인지도 및 가이드에서, 나는 올바르게 설정하고 나는 손실에 있다고 믿습니다.

또한 glError()는 오류를 반환하지 않으며 오류를 검사 할 수있는 모든 셰이더 컴파일 또는 링크 프로세스는 오류를보고하지 않습니다.

아이디어가 있으십니까?

+0

glViewport() 호출이 필요한 것입니다. 웬일인지 나는 이것을 간과했고, 여러 가지 튜토리얼에서 그것을 결코 보지 못했다. 정말 고마워. – sugarmuff

답변

1

몇 조각이 누락되었습니다.

놓친 가장 중요한 점은 뷰포트를 설정하는 것입니다. glViewport(x, y, width, height)은 렌더링 버퍼의 크기로 설정해야합니다. 이는 버퍼의 어떤 부분을 그리는 지 정의하고 수동으로 설정해야합니다.

두 번째는 그리기 호출이 끝날 때 정점 특성 배열을 사용하지 않도록 설정되어 있지만 호출을 시작할 때 사용하지 않는 것 같습니다. 귀하의 경우에는 비활성화가 실제로 필요한 것은 아니며 셰이더 (glUseProgram)를 사용할 때만 활성화하는 것이 좋습니다. 그러나 일반적으로 사용하는 모든 속성이 활성화되어 있는지 확인하십시오. 코드에서 삼각형은 첫 번째 프레임 만 그려지고 다음 프레임에서는 사라집니다.

관련 문제