방금 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;
}
...하지만 아무것도 인쇄
먼저 '/ n'은 '\ n'과 동일하지 않습니다. 둘째, 셰이더를 컴파일 할 때 오류 메시지가 있는지 확인해야합니다. 'glGetShaderInfoLog()'를 사용하십시오. –
당신은 당신이 무슨 문제가있어, 컴파일 오류를 언급하지 않았습니까? 그리기 문제? –
그냥 그다지 그릴 수 없어요. 프로그램을 실행할 때 빈 화면이 나타납니다. –