간단한 삼각형을 그릴 때 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)
으로 변경하면 화면 중간에 흰색 픽셀 하나가 나타납니다.
내가 뭘 잘못하고 있니? 다른 사람들이 지적했듯이
실례지만, OpenGL 3.x에서는 셰이더 프로그램의 일부로 프래그먼트 셰이더가 필요하지 않습니까? 또한 버텍스 버퍼 코드를 게시하십시오. 당신은 도려내거나 극 소형 뷰포트로 렌더링하지 않습니다. – Raja
'glLinkProgram (program);의 반환 값을 검사 해 보셨습니까? 프래그먼트 셰이더를 제공하지 않았기 때문에 실패 할까 봐 걱정됩니다. 또한 버텍스 쉐이더 소스가 이상하게 보입니다. – starrify
방금 시작한 이래로 다음을 살펴 보는 것이 좋습니다. http://arcsynthesis.org/gltut/Basics/Tutorial%2001.html 멋진 코드와 프레임 워크가 있습니다. 코드 (컴파일, 셰이더 연결 및 인쇄 오류 등) – Raja