2013-07-29 2 views
1

Я пытаюсь отобразить на OSX с помощью CoreGL и Framebuffer: кажется, что рендеринг треугольника вообще не работает, в то время как, например, glClear с цветом будет отображаться в результате Изображение PPM.Apple OSX OpenGL автономный рендеринг с CoreGL

Я пробовал несколько вариантов кода ниже, но прямо сейчас мне кажется, что это невыполнимая задача на OSX.

#include <stdio.h> 
#include <OpenGL/OpenGL.h> 
#include <Opengl/glext.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <opengl/gl3.h> 

int main(int argc, const char * argv[]) 
{ 

CGLContextObj context; 
CGLPixelFormatAttribute attributes[13] = { 
    kCGLPFAOpenGLProfile, 
    (CGLPixelFormatAttribute) kCGLOGLPVersion_3_2_Core, 
    kCGLPFAAccelerated, 
    kCGLPFAColorSize, (CGLPixelFormatAttribute)24, 
    kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, 
    kCGLPFADoubleBuffer, 
    kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1, 
    kCGLPFASamples, (CGLPixelFormatAttribute)4, 
    (CGLPixelFormatAttribute) 0 
}; 
CGLPixelFormatObj pix; CGLError errorCode; GLint num; 
errorCode = CGLChoosePixelFormat(attributes, &pix, &num); 
errorCode = CGLCreateContext(pix, NULL, &context); 
CGLDestroyPixelFormat(pix); 
errorCode = CGLSetCurrentContext(context); 
// ------- 
GLuint VertexArrayID; 
glGenVertexArrays(1, &VertexArrayID); 
glBindVertexArray(VertexArrayID); 
//-------- 
GLuint fboid, rboid, dboid; 
glGenFramebuffers(1, &fboid); 
glBindFramebuffer(GL_FRAMEBUFFER, fboid); 

glGenRenderbuffers(1, &rboid); 
glBindRenderbuffer(GL_RENDERBUFFER, rboid); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 1440, 900); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboid); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 

glGenRenderbuffers(1, &dboid); 
glBindRenderbuffer(GL_RENDERBUFFER, dboid); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1440, 900); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dboid); 
glBindRenderbuffer(GL_RENDERBUFFER, 0); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
// -------- 

glBindFramebuffer(GL_FRAMEBUFFER, fboid); 

static const GLfloat g_vertex_buffer_data[] = {-1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f}; 
GLuint vertexbuffer; 
glGenBuffers(1, &vertexbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 
assert(glGetError()==0); 
// ------- 
glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle 
glDisableVertexAttribArray(0); 
// ------- 
errorCode = CGLFlushDrawable(context); 

char data[1440*900*3]; 
glReadPixels(0, 0, 1440, 900, GL_BGR, GL_UNSIGNED_BYTE, &data[0]); 
FILE* ff = fopen("/Users/invernizzi/pippo.ppm", "w"); 
char* header = "P6 1440 900 255 "; 
size_t i = fwrite(header, sizeof(char), 16, ff); 
i = fwrite(&data[0], sizeof(char), 1440*900*3, ff); 
fclose(ff); 

return 0; 
} 
+1

где ваши вершинные/фрагментарные шейдеры? –

ответ

1

Если у вас есть контекст 3.2, вам необходимо создать и привязать программу с помощью программ вершин и фрагментов. Тот факт, что вы видите прозрачный цвет, показывает, что контекст создан правильно.