#graphics #opengl-es
#графика #opengl-es
Вопрос:
РЕДАКТИРОВАТЬ РЕШЕНИЕ: Цилиндр в OpenGL ES:
///Storing a cylinder in a VBO
int verticesCyl = 60;
int indicesCyl = verticesCyl 2;
float cylHeight = .2f;
void initCylinder(GL10 gl) {
GL11 gl11 = (GL11) gl;
FloatBuffer vertBuffer = ByteBuffer.allocateDirect(verticesCyl * 3 *
4).order(ByteOrder.nativeOrder())
.asFloatBuffer();
ShortBuffer indexBuffer = ByteBuffer.allocateDirect(indicesCyl * 2).order(ByteOrder.nativeOrder())
.asShortBuffer();
float vertices[] = new float[verticesCyl * 3];
short indices[] = new short[indicesCyl];
for (int j = 0; j < verticesCyl*3 ; j =3) {
vertices[j] = (float) (Math.cos(theta));
vertices[j 1] = (float) (Math.sin(theta));
vertices[j 2] = j % 2 == 0 ? cylHeight : -cylHeight;
theta = 2 * Math.PI / (verticesCyl);
}
for (int j = 0; j < indicesCyl; j ) {
indices[j] = (short) (j % verticesCyl) ;
}
indexBuffer.put(indices);
vertBuffer.put(vertices);
indexBuffer.flip();
vertBuffer.flip();
int[] buffer = new int[1];
gl11.glGenBuffers(1, buffer, 0);
vertexPointerCyl = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerCyl);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, vertBuffer.capacity() * 4, vertBuffer, GL11.GL_STATIC_DRAW);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glGenBuffers(1, buffer, 0);
indexPointerCyl = buffer[0];
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerCyl);
gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * 2, indexBuffer, GL11.GL_STATIC_DRAW);
}
////////////Draw the cylinder
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerCyl);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerCyl);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glPushMatrix();
gl11.glColor4f(shadowColor,shadowColor,shadowColor, alpha);
gl11.glTranslatef(mainX, mainY, 0);
gl11.glScalef(scaleFactor, scaleFactor, 0);
gl11.glRotatef(rotateCylinder, mainX, mainY, 0);
gl11.glDrawElements(GL11.GL_TRIANGLE_STRIP, indicesCyl, GL11.GL_UNSIGNED_SHORT, 0);
gl11.glPopMatrix();
Комментарии:
1. У вас отсутствует фигурная скобка после «для» — но я предполагаю, что это неверно в вашем реальном коде?
Ответ №1:
Моменты, которые следует учитывать:
- Вы «очищаете» графический контекст? (Я предполагаю, что вы используете Android, но я не знаю точного API для вызова)
- Вы загрузили буфер с помощью «glBufferData»?
- Включили ли вы состояние клиента vertex с помощью «glEnableClientState(GL_VERTEX_ARRAY)»?
Комментарии:
1. Прохладный… Тогда я могу предположить, что у вас есть контроль над другими базовыми «упсами», такими как перевод (т. Е. Он выводится из усеченного конуса или за ближнюю плоскость или за дальнюю плоскость), масштабирование (слишком маленький или слишком большой), вращение (поскольку у вашего цилиндра нет верхнего и нижнего кругов).)… В этом случае у меня есть еще две теории: первая, вы используете отбраковку обратной поверхности с неправильными нормалями; вторая, что (j%2) является int внутри массива с плавающей точкой.