2016-06-02 5 views
0

방금 ​​C++을 배우기 시작했고 색이있는 삼각형을 그려주는 셰이더 프로그램을 만들려고합니다. C++ OpenGL 셰이더가 작동하지 않습니다.

내 버텍스 쉐이더입니다 :

const GLchar* vertexSource = 
"#version 150 core\n" 
"in vec4 position;" 
"in vec4 color;" 
"out vec4 Color;" 
"out vec4 gl_Position;" 
"void main(){" 
" gl_Position = position;" 
" Color = color;" 
"}"; 

이 내 조각 쉐이더입니다 :

float vertices[]{ 
    -1.0f, -1.0f, 0.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 
    1.0f, -1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f,1.0f, 
    0.0f, 1.0f, 0.0f,1.0f, 0.0f,0.0f,1.0f,1.0f, 
}; 
: I는 각각 공동 ords 및 색상의 값의리스트를

const GLchar* fragmentSource = 
"#version 150 core\n" 
"in vec4 Color;" 
"out vec4 gl_FragColor" 
"void main(){" 
" gl_FragColor = Color;" 
"}"; 

'버텍스 버퍼 객체'와 '버텍스 배열 객체'를 초기화합니다.

루프

'동안 할'

glBindAttribLocation(shaderProgram, 0, "position"); 
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); 
glEnableVertexAttribArray(0); 

glBindAttribLocation(shaderProgram, 1 ,"color"); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(4 * sizeof(float))); 
glEnableVertexAttribArray(1); 

을 마지막으로 나는있는 삼각형을 그릴 :

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

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, 1, &fragmentSource, NULL); 
glCompileShader(fragmentShader); 

GLuint shaderProgram = glCreateProgram(); 
glAttachShader(shaderProgram, vertexShader); 
glAttachShader(shaderProgram, fragmentShader); 
glLinkProgram(shaderProgram); 

glUseProgram(shaderProgram); 

나는 쉐이더에 대한 몇 가지 속성을 정의 :

GLuint vao; //Initialise vertex array object 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

GLuint vbo; //Initialise vertex buffer object 
glGenBuffers(1,&vbo); 
glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW); 

나는 셰이더 프로그램을 컴파일

glDrawArrays(GL_TRIANGLES, 0, 3); 

그러나 삼각형을 인쇄하지는 않지만 대신 삼각형을 인쇄합니다. 검은 화면.

나는 튜토리얼 온라인에서이 코드의 대부분을 얻었으며, 모든 것이 어떻게 작동하는지 이해하기 위해 모든 것을 다시 쓰려고합니다.

내가 잘못 본 사람이 있습니까? 어떤 조언을 주시면 감사하겠습니다 :)

편집 : 오류를 확인하기 위해 몇 가지 코드를 추가 한

:

if (status == GL_FALSE) 
{ 
    GLint infoLogLength; 
    glGetShaderiv(shaderProgram, GL_INFO_LOG_LENGTH, &infoLogLength); 

    GLchar* strInfoLog = new GLchar[infoLogLength + 1]; 
    glGetProgramInfoLog(shaderProgram, infoLogLength, NULL, strInfoLog); 

    std::cout << strInfoLog; 
    delete[] strInfoLog; 
} 

...하지만 아무것도 인쇄

+3

먼저 '/ n'은 '\ n'과 동일하지 않습니다. 둘째, 셰이더를 컴파일 할 때 오류 메시지가 있는지 확인해야합니다. 'glGetShaderInfoLog()'를 사용하십시오. –

+0

당신은 당신이 무슨 문제가있어, 컴파일 오류를 언급하지 않았습니까? 그리기 문제? –

+0

그냥 그다지 그릴 수 없어요. 프로그램을 실행할 때 빈 화면이 나타납니다. –

답변

1

gl_Position이 사전입니다 정의 된 빌트인 변수와 GLSL 컴파일러는 그것과 오류를 재정의하려고 시도하는 것에 대해 불평하고있다. 마찬가지로 gl_FragColor은 예약 된 네임 스페이스에 있습니다.

물론 코드에는 쉐이더 정보 로그의 쿼리가 없으므로 컴파일러 출력이 표시되지 않습니다. 부록에서 프로그램 링커 로그를 쿼리합니다.

아마도이 솔루션은 쉐이더 소스에서 out vec4 gl_Positionout vec4 gl_FragColor을 생략하는 것만 큼 쉽습니다.

+1

또한 누락 된 ";" 이 줄에 : "out vec4 gl_FragColor", 이렇게하면 조각 컴파일이 실패 할 수 있습니다. –

+0

이상한; 나는 두 가지 오류를 수정했고, 여전히 아무 일도 일어나지 않는다. 아마도 다른 것? –

+0

@AdrianNgai : 더 많은 진단을 추가하십시오. 원래의 질문에 댓글을 달았고 저장소에 링크되어 있으면 몇 가지 진단 도구를 찾을 수 있습니다. – datenwolf

관련 문제