用`glDrawElements`绘制的立方体的SkyBox纹理映射

时间:2013-11-12 22:51:36

标签: opengl glsl texture-mapping skybox

this帖子中了解到,我使用glDrawElements函数绘制了一个多维数据集,而不是使用glDrawArrays(GL_TRIANGLES, 0, 6)函数绘制一个由大量顶点列表中指定的三角形组成的多维数据集

我使用glDrawArrays函数成功构建了两个三角形以创建纹理方块,但是当我在新的glDrawElements方法上尝试相同的方法时,我似乎无法使其工作。 ..

这就是我此刻绘制立方体的方式(包括我对纹理的尝试):

void SkyBox::constructGeometry(Shader* myShader)
{
    verts[0] = -dimX;   verts[ 1] = -dimY;  verts[ 2] = -dimZ; //0
    verts[3] = -dimX;   verts[ 4] =  dimY;  verts[ 5] = -dimZ; //1
    verts[6] =  dimX;   verts[ 7] =  dimY;  verts[ 8] = -dimZ; //2
    verts[9] =  dimX;   verts[10] = -dimY;  verts[11] = -dimZ; //3

    verts[12] = -dimX;   verts[13] = -dimY;  verts[14] = dimZ; //4
    verts[15] = -dimX;   verts[16] =  dimY;  verts[17] = dimZ; //5
    verts[18] =  dimX;   verts[19] =  dimY;  verts[20] = dimZ; //6
    verts[21] =  dimX;   verts[22] = -dimY;  verts[23] = dimZ; //7

    cols[0] = 0.0;   cols[ 1] = 0.0;  cols[ 2] = 0.0;
    cols[3] = 0.0;   cols[ 4] = 1.0;  cols[ 5] = 0.0;
    cols[6] = 0.0;   cols[ 7] = 0.0;  cols[ 8] = 1.0;
    cols[9] = 1.0;   cols[10] = 1.0;  cols[11] = 1.0;

    cols[12] = 1.0;   cols[13] = 0.0;  cols[14] = 0.0;
    cols[15] = 0.0;   cols[16] = 1.0;  cols[17] = 0.0;
    cols[18] = 0.0;   cols[19] = 0.0;  cols[20] = 1.0;
    cols[21] = 1.0;   cols[22] = 1.0;  cols[23] = 0.0;

    tris[0] =0; tris[1] =1; tris[2] =2;
    tris[3] =0; tris[4] =2; tris[5] =3;
    tris[6] =4; tris[7] =6; tris[8] =5;
    tris[9] =4; tris[10]=7; tris[11]=6;
    tris[12]=1; tris[13]=5; tris[14]=6;
    tris[15]=1; tris[16]=6; tris[17]=2;
    tris[18]=0; tris[19]=7; tris[20]=4;
    tris[21]=0; tris[22]=3; tris[23]=7;
    tris[24]=0; tris[25]=5; tris[26]=1;
    tris[27]=0; tris[28]=4; tris[29]=5;
    tris[30]=3; tris[31]=2; tris[32]=7;
    tris[33]=2; tris[34]=6; tris[35]=7;

    tex[0]  = 0.0;  tex[1] = 0.0;  tex[2] = 0.0;
    tex[3]  = 0.0;  tex[4] = 0.0;  tex[5] = 0.0;
    tex[6]  = 1.0;  tex[7] = 1.0;  tex[8] = 1.0;   
    tex[9]  = 1.0; tex[10] = 1.0; tex[11] = 1.0;
    tex[12] = 0.0; tex[13] = 1.0; tex[14] = 1.0;
    tex[15] = 0.0; tex[16] = 1.0; tex[17] = 0.0;
    tex[18] = 0.0; tex[19] = 1.0; tex[20] = 1.0;   
    tex[21] = 0.0; tex[22] = 0.0; tex[23] = 1.0;
    tex[24] = 0.0; tex[25] = 1.0; tex[26] = 0.0;
    tex[27] = 0.0; tex[28] = 1.0; tex[29] = 1.0;
    tex[30] = 0.0; tex[31] = 0.0; tex[32] = 1.0;   
    tex[33] = 0.0; tex[34] = 1.0; tex[35] = 1.0;

    glGenVertexArrays(2, &m_vaoID[0]);
    glBindVertexArray(m_vaoID[0]);
    glGenBuffers(3, m_vboID);

    GLint vertexLocation= glGetAttribLocation(myShader->handle(), "in_Position");
    GLint colorLocation= glGetAttribLocation(myShader->handle(), "in_Color");
    GLint texCoordLocation = glGetAttribLocation(myShader->handle(), "in_TexCoord");
    glUniform1i(glGetUniformLocation(myShader->handle(), "DiffuseMap"), 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_vboID[0]);
    glBufferData(GL_ARRAY_BUFFER, numOfVerts2 *3*sizeof(GLfloat), verts, GL_STATIC_DRAW);
    glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(vertexLocation);

    glBindBuffer(GL_ARRAY_BUFFER, m_vboID[1]);
    glBufferData(GL_ARRAY_BUFFER, numOfVerts2 *3*sizeof(GLfloat), cols, GL_STATIC_DRAW);
    glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(colorLocation);

    glBindBuffer(GL_ARRAY_BUFFER, m_vboID[2]);
    glBufferData(GL_ARRAY_BUFFER, numOfTexs *sizeof(GLfloat), tex, GL_STATIC_DRAW);
    glVertexAttribPointer(texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0,0);
    glEnableVertexAttribArray(texCoordLocation);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numOfTris2 * 3 * sizeof(unsigned int), tris, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    glEnableVertexAttribArray(0);

    glBindVertexArray(0);
}

我是如何呈现它的:

void SkyBox::render(Shader* myShader)           //shader expected
{
    glUseProgram(myShader->handle());       //shader
    glBindTexture(GL_TEXTURE_2D, texName);      //blending needed to use alpha channel
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    //draw objects
    glBindVertexArray(m_vaoID[0]);              // select VAO
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);     //element arrays to draw indices from an array
    glDrawElements(GL_TRIANGLES, numOfTris2 *3, GL_UNSIGNED_INT, 0);

    glDisable(GL_BLEND);
    glUseProgram(0);
    glBindVertexArray(0);

}

我整个晚上一直在盯着它,所以我可能会错过一些非常愚蠢的东西,但我只是看不出我出错的地方......

0 个答案:

没有答案