0
我有一臺運行OSX Lion的MacBook Pro,使用帶有Intel HD 3000 Graphics的CoreI5,我無法在Xcode 4中使用基本着色器。我熟悉Windows上的OpenGL和GLSL但對Mac來說是新手。我將GLSL代碼添加到「Mac上的可可」中。下面是代碼:GLSL着色器不能在OSX上使用Lion MacBook Pro
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar *vShaderSource = "void main() { \
gl_Position = ftransform; }";
glShaderSource(vshader, 1, &vShaderSource, NULL);
glCompileShader(vshader);
GLint good;
glGetShaderiv(vshader, GL_COMPILE_STATUS, &good);
if (good == GL_FALSE)
{
GLint logLength=0;
char *logMessage=NULL;
glGetShaderiv(vshader, GL_INFO_LOG_LENGTH, &logLength);
logMessage = malloc(logLength);
glGetShaderInfoLog(vshader, logLength, NULL, logMessage);
NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
free(logMessage);
return;
}
const GLchar *fShaderSource = "void main() { \
vec4 color = vec4(1.0, 0.0, 0.0, 1.0); \
gl_FragColor = color; \
}";
glShaderSource(fshader, 1, &fShaderSource, NULL);
glCompileShader(fshader);
glGetShaderiv(fshader, GL_COMPILE_STATUS, &good);
if (good == GL_FALSE)
{
GLint logLength=0;
char *logMessage=NULL;
glGetShaderiv(fshader, GL_INFO_LOG_LENGTH, &logLength);
logMessage = malloc(logLength);
glGetShaderInfoLog(fshader, logLength, NULL, logMessage);
NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
free(logMessage);
return;
}
program = glCreateProgram();
glAttachShader(program, vshader);
glAttachShader(program, fshader);
glLinkProgram(program);
// Check link status
glGetProgramiv(program, GL_LINK_STATUS, &good);
if (good == GL_FALSE)
{
int logLength=0;
char *logMessage=NULL;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
logMessage = malloc(logLength);
glGetProgramInfoLog(program, logLength, NULL, logMessage);
NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
free(logMessage);
return;
}
// Check validate status
glValidateProgram(program);
glGetProgramiv(program, GL_VALIDATE_STATUS, &good);
if (good == GL_FALSE)
{
int logLength=0;
char *logMessage=NULL;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
logMessage = malloc(logLength);
glGetProgramInfoLog(program, logLength, NULL, logMessage);
NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
free(logMessage);
return;
}
glUseProgram(program);
GLenum glError = glGetError();
if (glError)
{
char *errorMessage = gluErrorString(glError);
NSString *errorString = [[NSString alloc] initWithUTF8String:(errorMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
}
}
這裏是渲染循環:
static void drawAnObject()
{
glColor3f(1.0f, 0.85f, 0.35f);
glBegin(GL_TRIANGLES);
{
glVertex3f( 0.0, 0.6, 0.0);
glVertex3f(-0.2, -0.3, 0.0);
glVertex3f( 0.2, -0.3 ,0.0);
}
glEnd();
}
-(void)drawRect:(NSRect)bounds
{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
drawAnObject();
glFlush();
GLenum glError = glGetError();
if (glError)
{
char *errorMessage = gluErrorString(glError);
NSString *errorString = [[NSString alloc] initWithUTF8String:(errorMessage)];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:errorString];
[alert runModal];
}
}
你正在繪製什麼類型的NSView?簡單地清除OpenGL清晰顏色會給你預期的結果嗎? – user1118321 2012-03-26 16:13:38
你的'#版本'指令在哪裏?它究竟如何「不工作」? – genpfault 2012-03-26 16:17:54
NSView是NSOpenGL視圖。在渲染循環中更改清晰的顏色可獲得預期的結果。我試着添加「#version 120」,但我得到一個錯誤字符串的編譯錯誤:「syntax error #version」。當我說它不工作時,我的意思是三角形是DrawAnObject()方法中用glColor3f表示的顏色,而不是片段着色器中所述的紅色。 – 2012-03-26 16:35:12