[英]Drawing a cube with GlDrawElements()?
有沒有辦法像這樣繪制一個立方體,因此,只需要向顯卡上傳8個verticies和24個指示? 如果是這樣,怎么辦呢?
謝謝
我目前這樣做:
boxdims.x = w;
boxdims.y = h;
boxdims.z = d;
center = c;
GLfloat vboverticies[72];
GLfloat vbonormals[18];
Vertex3f verticies[24];
//Top face
verticies[0] = Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[1] = Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[2] = Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[3] = Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
//Bottom face
verticies[4] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[5] = Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[6] = Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[7] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
//Left face
verticies[8] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[9] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[10] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[11] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
//Right face
verticies[12] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[13] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[14] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[15] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
//Front face
verticies[16] =Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[17] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[18] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
verticies[19] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
//Back face
verticies[20] =Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[21] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[22] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
verticies[23] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
for(int i = 0; i < 24; i++)
{
verticies[i].x += center.x;
verticies[i].y += center.y;
verticies[i].z += center.z;
}
int count = 0;
for(int i = 0; i < 24; ++i)
{
vboverticies[count] = verticies[i].x;
count++;
vboverticies[count] = verticies[i].y;
count++;
vboverticies[count] = verticies[i].z;
count++;
}
//glNormal3f(0.0, 1.0f, 0.0f);
//glNormal3f(0.0, -1.0f, 0.0f);
//glNormal3f(-1.0, 0.0f, 0.0f);
//glNormal3f(1.0, 0.0f, 0.0f);
//glNormal3f(0.0, 0.0f, 1.0f);
//glNormal3f(0.0, 0.0f, -1.0f);
vbonormals[0] = (0.0);
vbonormals[1] = (1.0);
vbonormals[2] = (0.0);
vbonormals[3] = (0.0);
vbonormals[4] = (-1.0);
vbonormals[5] = (0.0);
vbonormals[6] = (-1.0);
vbonormals[7] = (0.0);
vbonormals[8] = (0.0);
vbonormals[9] = (1.0);
vbonormals[10]= (0.0);
vbonormals[11]= (0.0);
vbonormals[12]= (0.0);
vbonormals[13]= (0.0);
vbonormals[14]= (1.0);
vbonormals[15]= (0.0);
vbonormals[16]= (0.0);
vbonormals[17]= (-1.0);
//Create the VBO
glDeleteBuffers(1, &vboID);
glGenBuffersARB(1, &vboID);
glBindBufferARB(GL_ARRAY_BUFFER, vboID);
glBufferDataARB(GL_ARRAY_BUFFER, (72 * sizeof(GLfloat)) +
(18 * sizeof(GLfloat)) , NULL, GL_STATIC_COPY);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 72 * sizeof(GLfloat), vboverticies);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 72 * sizeof(GLfloat),
18 * sizeof(GLfloat), vbonormals);
}
答案是不。
如果您需要法線,則必須有24個頂點,因為沒有臉部共享法線。 請注意,shk提供的示例不處理法線。
你可以,但是你必須使用幾何着色器,除非你真的知道你在做什么,否則你不應該搞亂這些東西。 更重要的是,對於一個立方體來說,這真的不是什么大問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.