Android,OpenGL,立方体,灯光和材质(无纹理)

时间:2018-04-09 05:59:06

标签: android opengl-es

我为了这个问题的目的制作了这个非常简单的示例代码。它是用C ++编写的,使用OpenGL和FreeGLUT。我发现Android没有提供大多数这些功能,如glBeginglVertex3f等等......所以我的问题是如何在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;
}

0 个答案:

没有答案