2013-07-24 46 views
0

我想通过VAO,IBO和VBO渲染Quad,但没有绘制任何东西。我在OS X OpenGL 3.2 Core上下文中使用glDrawRangeElements。屏幕完全是黑色的,没有任何错误。 GLFW3用于创建窗口和上下文。OS X OpenGL 3.2核心(黑屏)

窗口打开/上下文创建代码

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
_mainWindow = glfwCreateWindow(width, height, title, monitor, NULL); 
if(_mainWindow == NULL) 
{ 
    return false; 
} 
_mainWindowWidth = width; 
_mainWindowHeight = height; 
glfwSetKeyCallback(_mainWindow, _onKeyEvent); 
glfwMakeContextCurrent(_mainWindow); 

glewExperimental = GL_TRUE; 
glewInit(); 

_openGLVersion = reinterpret_cast<const char*>(glGetString(GL_VERSION)); 

着色器源(编译成功)。自定义FragColor被绑定。

_vertexShaderSource = 
      "#version 150 core\n" 
      "in vec3 in_Position;\n" 
      "in vec3 in_Normal;\n" 
      "in vec2 in_TexCoord;\n" 
      "uniform mat4 ModelViewProjection;\n" 
      "void main()\n" 
      "{\n" 
      " gl_Position = ModelViewProjection * vec4(in_Position, 1.0);\n" 
      "}\n"; 
_fragmentShaderSource = 
      "#version 150 core\n" 
      "out vec4 FColor;" 
      "void main()\n" 
      "{\n" 
      " FColor = vec4(1.0, 1.0, 1.0, 1.0);\n" 
      "}\n"; 

顶点

Vertex* vertices = new Vertex[6]; 

vertices[0].nz = 1.0f; 
vertices[1].nz = 1.0f; 
vertices[2].nz = 1.0f; 
vertices[3].nz = 1.0f; 
vertices[4].nz = 1.0f; 
vertices[5].nz = 1.0f; 

vertices[1].y = height; 
vertices[1].v0 = 1.0f; 

vertices[2].x = width; 
vertices[2].y = height; 
vertices[2].u0 = 1.0f; 
vertices[2].v0 = 1.0f; 

vertices[4].x = width; 
vertices[4].u0 = 1.0f; 

vertices[5].x = width; 
vertices[5].y = height; 
vertices[5].u0 = 1.0f; 
vertices[5].v0 = 1.0f; 

_mesh->setVertices(vertices, 6); 
vertices = NULL; 

Uint16* indices = new Uint16[6]; 

indices[0] = 0; 
indices[1] = 2; 
indices[2] = 3; 
indices[3] = 0; 
indices[4] = 1; 
indices[5] = 3; 

_mesh->setIndices(indices); 
indices = NULL; 

缓冲更新(检查数据,这似乎是正确的)

// Update VBO 
if(_vertexBufferObjectID == 0) 
{ 
     glGenBuffers(1, &_vertexBufferObjectID); 
} 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferObjectID); 

float* data = new float[_vertexCount * sizeof(Vertex)/sizeof(float)]; 
Uint64 begin = 0; 
for(Uint32 i = 0; i < _vertexCount; i++) 
{ 
    begin = i * 8; 
    data[begin]  = _vertices[i].x; 
    data[begin + 1] = _vertices[i].y; 
    data[begin + 2] = _vertices[i].z; 
    data[begin + 3] = _vertices[i].nx; 
    data[begin + 4] = _vertices[i].ny; 
    data[begin + 5] = _vertices[i].nz; 
    data[begin + 6] = _vertices[i].u0; 
    data[begin + 7] = _vertices[i].v0; 
} 

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * _vertexCount, &data[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

delete[] data; 
data = NULL; 

// Update IBO 
if(_indexBufferObjectID == 0) 
{ 
    glGenBuffers(1, &_indexBufferObjectID); 
} 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferObjectID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Uint16) * _vertexCount, &_indices[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

// Update VAO 
if(_vertexArrayObjectID == 0) 
{ 
    glGenVertexArrays(1, &_vertexArrayObjectID); 
} 
glBindVertexArray(_vertexArrayObjectID); 

glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferObjectID); 
// Vertices 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), ((char*)NULL + (0))); 
// Normals 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), ((char*)NULL + (12))); 
// TexCoords 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), ((char*)NULL + (24))); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferObjectID); 

glBindVertexArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

渲染代码

glUseProgram(material->_programID); 
GLuint mvp = glGetUniformLocation(material->_programID, "ModelViewProjection"); 
glUniformMatrix4fv(mvp, 1, false, glm::value_ptr(camera_mvp)); 

glBindVertexArray(node->_mesh->_vertexArrayObjectID); 

// Draw 
glDrawRangeElements(GL_TRIANGLES, 0, 3, node->_mesh->_vertexCount, GL_UNSIGNED_SHORT, NULL); 
glBindVertexArray(0); 

注: camera_mvp为正交

0.00333333_0___________0 0 
0__________0.00333333__0 0 
0__________0__________-1 0 
599________599_________0 1 

程序链接

_programID = glCreateProgram(); 
glAttachShader(_programID, vertex_shader); 
glAttachShader(_programID, fragment_shader); 

glLinkProgram(_programID); 
glGetProgramiv(_programID, GL_LINK_STATUS, &result); 
glGetProgramiv(_programID, GL_INFO_LOG_LENGTH, &loglen); 

if(loglen > 0) 
{ 
    char* log = new char[loglen]; 

    glGetProgramInfoLog(_programID, loglen, 0, log); 
    _lastInfoLog = log; 

    delete log; 
    log = NULL; 
} 

if(result == GL_FALSE) 
{ 
    glDeleteProgram(_programID); 
    glDeleteShader(vertex_shader); 
    glDeleteShader(fragment_shader); 
    return false; 
} 

glUseProgram(_programID); 
glBindAttribLocation(_programID, 0, "in_Position"); 
glBindAttribLocation(_programID, 1, "in_Normal"); 
glBindAttribLocation(_programID, 2, "in_TexCoord"); 
glBindFragDataLocation(_programID, 0, "FColor"); 
glUseProgram(0); 

glDeleteShader(vertex_shader); 
glDeleteShader(fragment_shader); 

回答

0

您不必layout#version 150,所以你必须使用glGetAttribLocation()问OpenGL的情况下它把你的属性,并适当地调整你的glVertexAttribPointer()调用的第一个参数。

确保你在调用glGetAttribLocation()之前绑定你的程序。

+0

我已将代码添加到链接我的程序的位置。我想我正确地绑定属性位置。 – nmindiedev

+0

UPD:我检查了所有属性位置。他们是完美的绑定。 – nmindiedev