내 프로그램에서 내 자신의 정점 및 조각 쉐이더를 만들려고합니다. (기본적으로 VBO로 삼각형을 표시하는 아주 간단한 프로그램입니다). 그러나, 그것을 실행할 때, 나는 항상 아무 것도 나타나지 않는 검은 색 화면을 얻습니다. 컴파일 로그를 확인한 결과 오류없이 반환됩니다. 나는 내 자신의 커스텀 쉐이더로 프로그램을 실행해야만하는데, 여기서 나는 틀린 일을하는지 궁금하게 생각한다. 내가 OpenGL을 3.2 GLSL 1.5GLSL 1.5가 Mac OS X에서 작동하도록하기
다음에 내 코드를 실행하고있어 내가 몇 가지 문제가 여기에있다 현재
GLuint vbo;
GLfloat data[] = {0.0, 0.0, -5.0,
1.0, 0.0, -5.0,
1.0, 1.0, -5.0
};
const char *vertexShader = "\n\
#version 150\n\
\n\
layout (location=0) in vec4 position;\n\
void main()\n\
{\n\
gl_Position = position;\n\
}\n\
";
const char *fragmentShader = "\n\
#version 150\n\
\n\
out vec4 outColor;\n\
\n\
void main()\n\
{\n\
outColor = vec4(1.0, 0.0, 0.0, 1.0);\n\
}";
- (void)drawRect:(NSRect)dirtyRect
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glUseProgram(programId);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, sizeof(data));
glFlush();
glDisableClientState(GL_VERTEX_ARRAY);
}
-(void)reshape
{
glViewport(0, 0, w, h);
gluPerspective(45.0, //The camera angle
(double)w/(double)h, //The width-to-height ratio
1.0, //The near z clipping coordinate
200.0);
}
-(void)prepareOpenGL
{
glEnable(GL_DEPTH_TEST);
glGenBuffersARB(1, &vbo);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(data), data, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, 0, 0, 0);
vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderId, 1, &vertexShader, NULL);
glCompileShader(vertexShaderId);
GLint completed;
glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &completed);
if (!completed)
{
GLint length;
GLchar *log;
glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &length);
log = (GLchar *)malloc(length);
glGetShaderInfoLog(vertexShaderId, length, &length, log);
fprintf(stderr, "Vertex compile log = '%s'\n", log);
}
fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderId, 1, &fragmentShader, NULL);
glCompileShader(fragmentShaderId);
GLint complete;
glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &complete);
if (!complete)
{
GLint length;
GLchar *log;
glGetShaderiv(fragmentShaderId, GL_INFO_LOG_LENGTH, &length);
log = (GLchar *)malloc(length);
glGetShaderInfoLog(fragmentShaderId, length, &length, log);
fprintf(stderr, "fragment compile log = '%s'\n", log);
}
programId = glCreateProgram();
glAttachShader(programId, vertexShaderId);
glAttachShader(programId, fragmentShaderId);
glLinkProgram(programId);
glUseProgram(programId);
}
문제가되지 않는 것 같습니다. 나는 여전히 검은 색 화면을 얻는다. – TheAmateurProgrammer
@theAmateurProgrammer : 아니요, 문제입니다. 그것은 단지 * 유일한 * 하나가 아닙니다. 내 편집을 참조하십시오. –
"게다가, OSX의 GL 3.2 지원이이 확장 기능을 제공하지 않는다는 사실을 알고 있습니다." 사실, 사과 웹 사이트와 OpenGL 확장 뷰어에서 언급했듯이 확장 기능을 쿼리하기 위해 glGet()을 사용합니다 .... 유일한 단점은 "#extension GL_ARB_explicit_attrib_location : enable"을 사용하면 다음과 같이 정의해야한다는 것입니다. 너무 많이 좋네요! –