我想在我的程序中創建自己的頂點和片段着色器(這基本上是一個顯示VBO三角形的非常簡單的程序)。但是,當我嘗試運行它時,我總是得到一個沒有任何顯示的黑屏。我檢查了編譯日誌,並返回了沒有錯誤。我還沒有用自己的自定義着色器運行一個程序,這讓我想知道在這裏做錯了什麼。我跑我的代碼上的OpenGL 3.2和GLSL 1.5讓GLSL 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 2012-04-22 01:21:26
@theAmateurProgrammer:不,這是問題;它只是不是*唯一*一個。看我的編輯。 – 2012-04-22 01:51:36
「另外,我知道OSX的GL 3.2支持不提供這種擴展。」實際上,它確實(正如蘋果公司的網站和openGL擴展查看器所指出的那樣,並且還使用glGet()來查詢擴展......唯一的怪癖是你必須將它定義爲:「#extension GL_ARB_explicit_attrib_location:enable」它使用glsl好多了! – 2014-06-02 21:33:00