我为了这个问题的目的制作了这个非常简单的示例代码。它是用C ++编写的,使用OpenGL和FreeGLUT。我发现Android没有提供大多数这些功能,如glBegin
,glVertex3f
等等......所以我的问题是如何在Android(Java或C ++)中创建一个像这样的应用程序,显示旋转立方体使用材料光和无纹理。我发现没有文章在互联网上回答这个问题,所以我希望这篇文章能帮助其他人。
#include "freeglut.h"
#include <chrono>
#include <cmath>
void initialiseScene()
{
glClearColor(0.5f, 0.6f, 0.7f, 1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
GLfloat lightAmbient[] = { 0.2f, 0.2f, 0.5f, 1.0f };
GLfloat lightColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat lightPos[] = { 0.0f, 0.0f, 3.0f, 1.0f };
glLightModelfv(GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
GLfloat materialAmbient[] = { 0.3f, 0.2f, 0.0f, 1.0f };
GLfloat materialDiffuse[] = { 0.9f, 0.8f, 0.4f, 1.0f };
GLfloat materialSpecular[] = { 0.4f, 0.3f, 0.0f, 1.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, materialAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, materialDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, materialSpecular);
glMaterialf(GL_FRONT, GL_SHININESS, 25);
}
void renderScene()
{
GLfloat s = 0.5;
glNormal3f(-1, 0, 0);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-s, -s, s);
glVertex3f(-s, -s, -s);
glVertex3f(-s, s, s);
glVertex3f(-s, s, -s);
glEnd();
glNormal3f(1, 0, 0);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(s, s, s);
glVertex3f(s, s, -s);
glVertex3f(s, -s, s);
glVertex3f(s, -s, -s);
glEnd();
glNormal3f(0, -1, 0);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-s, -s, -s);
glVertex3f(-s, -s, s);
glVertex3f(s, -s, -s);
glVertex3f(s, -s, s);
glEnd();
glNormal3f(0, 1, 0);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(s, s, -s);
glVertex3f(s, s, s);
glVertex3f(-s, s, -s);
glVertex3f(-s, s, s);
glEnd();
glNormal3f(0, 0, -1);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-s, s, -s);
glVertex3f(-s, -s, -s);
glVertex3f(s, s, -s);
glVertex3f(s, -s, -s);
glEnd();
glNormal3f(0, 0, 1);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-s, -s, s);
glVertex3f(-s, s, s);
glVertex3f(s, -s, s);
glVertex3f(s, s, s);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
static std::chrono::time_point<std::chrono::system_clock> start = std::chrono::system_clock::now();
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
glRotated(millis / 10., 1, 1, 1);
renderScene();
glPopMatrix();
glutSwapBuffers();
}
void resize(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90, (double) width / (double) height, 1, -1);
glTranslatef(0, 0, -2);
glMatrixMode(GL_MODELVIEW);
}
void idle()
{
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowSize(800, 600);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Example");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutIdleFunc(idle);
initialiseScene();
glutMainLoop();
return 0;
}