Path: blob/main_old/samples/torus_lighting/TorusLightingES2.cpp
1694 views
//1// Copyright 2021 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// Based on CubeMapActivity.java from The Android Open Source Project ApiDemos7// https://android.googlesource.com/platform/development/+/refs/heads/master/samples/ApiDemos/src/com/example/android/apis/graphics/CubeMapActivity.java89#include "SampleApplication.h"1011#include "torus.h"12#include "util/Matrix.h"13#include "util/shader_utils.h"1415class GLES2TorusLightingSample : public SampleApplication16{17public:18GLES2TorusLightingSample(int argc, char **argv)19: SampleApplication("GLES2 Torus Lighting", argc, argv, 2, 0)20{}2122bool initialize() override23{24constexpr char kVS[] = R"(uniform mat4 mv;25uniform mat4 mvp;2627attribute vec4 position;28attribute vec3 normal;2930varying vec3 normal_view;3132void main()33{34normal_view = vec3(mv * vec4(normal, 0.0));35gl_Position = mvp * position;36})";3738constexpr char kFS[] = R"(precision mediump float;3940varying vec3 normal_view;4142void main() {43gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0) * dot(vec3(0.0, 0, 1.0), normalize(normal_view));44})";4546mProgram = CompileProgram(kVS, kFS);47if (!mProgram)48{49return false;50}5152mPositionLoc = glGetAttribLocation(mProgram, "position");53mNormalLoc = glGetAttribLocation(mProgram, "normal");5455mMVPMatrixLoc = glGetUniformLocation(mProgram, "mvp");56mMVMatrixLoc = glGetUniformLocation(mProgram, "mv");5758glClearColor(0.0f, 0.0f, 0.0f, 0.0f);59glEnable(GL_DEPTH_TEST);6061GenerateTorus(&mVertexBuffer, &mIndexBuffer, &mIndexCount);6263return true;64}6566void destroy() override67{68glDeleteProgram(mProgram);69glDeleteBuffers(1, &mVertexBuffer);70glDeleteBuffers(1, &mIndexBuffer);71}7273void draw() override74{75glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());76glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);7778glUseProgram(mProgram);7980float ratio = (float)getWindow()->getWidth() / (float)getWindow()->getHeight();81Matrix4 perspectiveMatrix = Matrix4::frustum(-ratio, ratio, -1, 1, 1.0f, 20.0f);8283Matrix4 modelMatrix = Matrix4::translate(angle::Vector3(0, 0, -5)) *84Matrix4::rotate(mAngle, angle::Vector3(0.0f, 1.0f, 0.0f)) *85Matrix4::rotate(mAngle * 0.25f, angle::Vector3(1.0f, 0.0f, 0.0f));8687Matrix4 mvpMatrix = perspectiveMatrix * modelMatrix;8889glUniformMatrix4fv(mMVMatrixLoc, 1, GL_FALSE, modelMatrix.data);90glUniformMatrix4fv(mMVPMatrixLoc, 1, GL_FALSE, mvpMatrix.data);9192glEnableVertexAttribArray(mPositionLoc);93glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);94glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, false, 6 * sizeof(GLfloat), nullptr);9596glVertexAttribPointer(mNormalLoc, 3, GL_FLOAT, false, 6 * sizeof(GLfloat),97reinterpret_cast<const void *>(3 * sizeof(GLfloat)));98glEnableVertexAttribArray(mNormalLoc);99100glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);101glDrawElements(GL_TRIANGLES, mIndexCount, GL_UNSIGNED_SHORT, 0);102glBindBuffer(GL_ARRAY_BUFFER, 0);103glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);104105mAngle++;106}107108private:109GLuint mProgram;110111GLint mPositionLoc;112GLint mNormalLoc;113114GLuint mMVPMatrixLoc;115GLuint mMVMatrixLoc;116117GLuint mVertexBuffer;118GLuint mIndexBuffer;119GLsizei mIndexCount;120121float mAngle = 0;122};123124int main(int argc, char **argv)125{126GLES2TorusLightingSample app(argc, argv);127return app.run();128}129130131