如何在OpenGL中结合纹理和照明

如何在OpenGL中结合纹理和照明,opengl,texture-mapping,lighting,Opengl,Texture Mapping,Lighting,我正在尝试在OpenGL中结合金字塔上的纹理和照明。我基本上是从合并两个独立的代码开始的,现在,我正在努力进行更改以平滑合并。然而,我有两个问题 我需要删除对象颜色并用纹理替换它,但我不确定如何用这段代码解决这个问题,因为对象颜色在代码中根深蒂固 我不知道如何列出位置、法线和纹理的坐标。他们目前的安排似乎给产出带来了很多问题 对于第一个问题,我尝试用纹理替换pyramidColor和objectColor,但它似乎产生了更多问题 对于第二个问题,我尝试将列表顺序重新排列为位置、纹理和法线,这对一

我正在尝试在OpenGL中结合金字塔上的纹理和照明。我基本上是从合并两个独立的代码开始的,现在,我正在努力进行更改以平滑合并。然而,我有两个问题

  • 我需要删除对象颜色并用纹理替换它,但我不确定如何用这段代码解决这个问题,因为对象颜色在代码中根深蒂固
  • 我不知道如何列出位置、法线和纹理的坐标。他们目前的安排似乎给产出带来了很多问题
  • 对于第一个问题,我尝试用纹理替换pyramidColor和objectColor,但它似乎产生了更多问题

    对于第二个问题,我尝试将列表顺序重新排列为位置、纹理和法线,这对一些三角形很有帮助。然而,这仍然是不对的

    /*Header Inclusions*/
    #include <iostream>
    #include <GL/glew.h>
    #include <GL/freeglut.h>
    
    //GLM Math Header Inclusions
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
    
    //SOIL image loader Inclusion
    #include "SOIL2/SOIL2.h"
    
    using namespace std; //Standard namespace
    
    #define WINDOW_TITLE "Pyramid" //Window title Macro
    
    /*Shader program Macro*/
    #ifndef GLSL
    #define GLSL(Version, Source) "#version " #Version "\n" #Source
    #endif
    
    
    /*Variable declarations for shader, window size initialization, buffer and array objects */
    GLint pyramidShaderProgram, lampShaderProgram, WindowWidth = 800, WindowHeight = 600;
    GLuint VBO, PyramidVAO, LightVAO, texture;
    
    //Subject position and scale
    glm::vec3 pyramidPosition(0.0f, 0.0f, 0.0f);
    glm::vec3 pyramidScale(2.0f);
    
    //pyramid and light color
    glm::vec3 objectColor(1.0f, 1.0f, 1.0f);
    glm::vec3 lightColor(1.0f, 1.0f, 1.0f);
    
    //Light position and scale
    glm::vec3 lightPosition(0.5f, 0.5f, -3.0f);
    glm::vec3 lightScale(0.3f);
    
    //Camera position
    glm::vec3 cameraPosition(0.0f, 0.0f, -6.0f);
    
    //Camera rotation
    float cameraRotation = glm::radians(-25.0f);
    
    /*Function prototypes*/
    void UResizeWindow(int, int);
    void URenderGraphics(void);
    void UCreateShader(void);
    void UCreateBuffers(void);
    void UGenerateTexture(void);
    
    
    /*Pyramid Vertex Shader Source Code*/
    const GLchar * pyramidVertexShaderSource = GLSL(330,
            layout (location = 0) in vec3 position; //Vertex data from Vertex Attrib Pointer 0
            layout (location = 1) in vec3 normal; //VAP position 1 for normals
            layout (location = 2) in vec2 textureCoordinate;
    
            out vec3 FragmentPos; //For outgoing color / pixels to fragment shader
            out vec3 Normal; //For outgoing normals to fragment shader
            out vec2 mobileTextureCoordinate;
    
    
            //Global variables for the transform matrices
            uniform mat4 model;
            uniform mat4 view;
            uniform mat4 projection;
    
    void main(){
            gl_Position = projection * view * model * vec4(position, 1.0f); //transforms vertices to clip coordinates
    
            FragmentPos = vec3(model * vec4(position, 1.0f)); //Gets fragment / pixel position in world space only (exclude view and projection)
    
            Normal = mat3(transpose(inverse(model))) *  normal; //get normal vectors in world space only and exclude normal translation properties
    
            mobileTextureCoordinate = vec2(textureCoordinate.x, 1 - textureCoordinate.y); //flips the texture horizontal
        }
    );
    
    
    /*Pyramid Fragment Shader Source Code*/
    const GLchar * pyramidFragmentShaderSource = GLSL(330,
    
            in vec3 FragmentPos; //For incoming fragment position
            in vec3 Normal; //For incoming normals
            in vec2 mobileTextureCoordinate;
    
            out vec4 pyramidColor; //For outgoing pyramid color to the GPU
            out vec4 gpuTexture; //Variable to pass color data to the GPU
    
            //Uniform / Global variables for object color, light color, light position, and camera/view position
            uniform vec3 objectColor;
            uniform vec3 lightColor;
            uniform vec3 lightPos;
            uniform vec3 viewPosition;
    
            uniform sampler2D uTexture; //Useful when working with multiple textures
    
            void main(){
    
                /*Phong lighting model calculations to generate ambient, diffuse, and specular components*/
    
                //Calculate Ambient Lighting
                float ambientStrength = 0.1f; //Set ambient or global lighting strength
                vec3 ambient = ambientStrength * lightColor; //Generate ambient light color
    
    
                //Calculate Diffuse Lighting
                vec3 norm = normalize(Normal); //Normalize vectors to 1 unit
                vec3 lightDirection = normalize(lightPos - FragmentPos); //Calculate distance (light direction) between light source and fragments/pixels on
                float impact = max(dot(norm, lightDirection), 0.0); //Calculate diffuse impact by generating dot product of normal and light
                vec3 diffuse = impact * lightColor; //Generate diffuse light color
    
    
                //Calculate Specular lighting
                float specularIntensity = 0.8f; //Set specular light strength
                float highlightSize = 128.0f; //Set specular highlight size
                vec3 viewDir = normalize(viewPosition - FragmentPos); //Calculate view direction
                vec3 reflectDir = reflect(-lightDirection, norm); //Calculate reflection vector
                //Calculate specular component
                float specularComponent = pow(max(dot(viewDir, reflectDir), 0.0), highlightSize);
                vec3 specular = specularIntensity * specularComponent * lightColor;
    
                //Calculate phong result
                vec3 phong = (ambient + diffuse + specular) * objectColor;
    
                pyramidColor = vec4(phong, 1.0f); //Send lighting results to GPU
    
                gpuTexture = texture(uTexture, mobileTextureCoordinate);
    
            }
    );
    
    
    /*Lamp Shader Source Code*/
    const GLchar * lampVertexShaderSource = GLSL(330,
    
            layout (location = 0) in vec3 position; //VAP position 0 for vertex position data
    
            //Uniform / Global variables for the transform matrices
            uniform mat4 model;
            uniform mat4 view;
            uniform mat4 projection;
    
            void main()
            {
                gl_Position = projection * view *model * vec4(position, 1.0f); //Transforms vertices into clip coordinates
            }
    );
    
    
    /*Fragment Shader Source Code*/
    const GLchar * lampFragmentShaderSource = GLSL(330,
    
            out vec4 color; //For outgoing lamp color (smaller pyramid) to the GPU
    
            void main()
            {
                color = vec4(1.0f); //Set color to white (1.0f, 1.0f, 1.0f) with alpha 1.0
    
            }
    );
    
    
    /*Main Program*/
    int main(int argc, char* argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowSize(WindowWidth, WindowHeight);
        glutCreateWindow(WINDOW_TITLE);
    
        glutReshapeFunc(UResizeWindow);
    
    
        glewExperimental = GL_TRUE;
                if (glewInit() != GLEW_OK)
                {
                    std::cout<< "Failed to initialize GLEW" << std::endl;
                    return -1;
                }
    
        UCreateShader();
    
        UCreateBuffers();
    
        UGenerateTexture();
    
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //Set background color
    
        glutDisplayFunc(URenderGraphics);
    
        glutMainLoop();
    
        //Destroys Buffer objects once used
        glDeleteVertexArrays(1, &PyramidVAO);
        glDeleteVertexArrays(1, &LightVAO);
        glDeleteBuffers(1, &VBO);
    
        return 0;
    }
    
    /*Resizes the window*/
    void UResizeWindow(int w, int h)
    {
        WindowWidth = w;
        WindowHeight = h;
        glViewport(0, 0, WindowWidth, WindowHeight);
    }
    
    
    /*Renders graphics*/
    void URenderGraphics(void)
    {
    
        glEnable(GL_DEPTH_TEST); //Enable z-depth
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clears the screen
    
        GLint modelLoc, viewLoc, projLoc, objectColorLoc, lightColorLoc, lightPositionLoc, viewPositionLoc;
    
        glm::mat4 model;
        glm::mat4 view;
        glm::mat4 projection;
    
        /*********Use the pyramid Shader to activate the pyramid Vertex Array Object for rendering and transforming*********/
        glUseProgram(pyramidShaderProgram);
        glBindVertexArray(PyramidVAO);
    
        //Transform the pyramid
        model = glm::translate(model, pyramidPosition);
        model = glm::scale(model, pyramidScale);
    
        //Transform the camera
        view = glm::translate(view, cameraPosition);
        view = glm::rotate(view, cameraRotation, glm::vec3(0.0f, 1.0f, 0.0f));
    
        //Set the camera projection to perspective
        projection = glm::perspective(45.0f,(GLfloat)WindowWidth / (GLfloat)WindowHeight, 0.1f, 100.0f);
    
        //Reference matrix uniforms from the pyramid Shader program
        modelLoc = glGetUniformLocation(pyramidShaderProgram, "model");
        viewLoc = glGetUniformLocation(pyramidShaderProgram, "view");
        projLoc = glGetUniformLocation(pyramidShaderProgram, "projection");
    
        //Pass matrix data to the pyramid Shader program's matrix uniforms
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
    
        //Reference matrix uniforms from the pyramid Shader program for the pyramid color, light color, light position, and camera position
        objectColorLoc = glGetUniformLocation(pyramidShaderProgram, "objectColor");
        lightColorLoc = glGetUniformLocation(pyramidShaderProgram, "lightColor");
        lightPositionLoc = glGetUniformLocation(pyramidShaderProgram, "lightPos");
        viewPositionLoc = glGetUniformLocation(pyramidShaderProgram, "viewPosition");
    
        //Pass color, light, and camera data to the pyramid Shader programs corresponding uniforms
        glUniform3f(objectColorLoc, objectColor.r, objectColor.g, objectColor.b);
        glUniform3f(lightColorLoc, lightColor.r, lightColor.g, lightColor.b);
        glUniform3f(lightPositionLoc, lightPosition.x, lightPosition.y, lightPosition.z);
        glUniform3f(viewPositionLoc, cameraPosition.x, cameraPosition.y, cameraPosition.z);
    
        glDrawArrays(GL_TRIANGLES, 0, 18); //Draw the primitives / pyramid
    
        glBindVertexArray(0); //Deactivate the Pyramid Vertex Array Object
    
        /***************Use the Lamp Shader and activate the Lamp Vertex Array Object for rendering and transforming ************/
        glUseProgram(lampShaderProgram);
        glBindVertexArray(LightVAO);
    
        //Transform the smaller pyramid used as a visual cue for the light source
        model = glm::translate(model, lightPosition);
        model = glm::scale(model, lightScale);
    
        //Reference matrix uniforms from the Lamp Shader program
        modelLoc = glGetUniformLocation(lampShaderProgram, "model");
        viewLoc = glGetUniformLocation(lampShaderProgram, "view");
        projLoc = glGetUniformLocation(lampShaderProgram, "projection");
    
        //Pass matrix uniforms from the Lamp Shader Program
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
    
        glBindTexture(GL_TEXTURE_2D, texture);
    
        //Draws the triangles
        glDrawArrays(GL_TRIANGLES, 0, 18);
    
        glBindVertexArray(0); //Deactivate the Lamp Vertex Array Object
    
        glutPostRedisplay();
        glutSwapBuffers(); //Flips the back buffer with the front buffer every frame. Similar to GL Flush
    
    }
    
    /*Create the Shader program*/
    void UCreateShader()
    {
    
        //Pyramid Vertex shader
        GLint pyramidVertexShader = glCreateShader(GL_VERTEX_SHADER); //Creates the Vertex shader
        glShaderSource(pyramidVertexShader, 1, &pyramidVertexShaderSource, NULL); //Attaches the Vertex shader to the source code
        glCompileShader(pyramidVertexShader); //Compiles the Vertex shader
    
        //Pyramid Fragment Shader
        GLint pyramidFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); //Creates the Fragment Shader
        glShaderSource(pyramidFragmentShader, 1, &pyramidFragmentShaderSource, NULL); //Attaches the Fragment shader to the source code
        glCompileShader(pyramidFragmentShader); //Compiles the Fragment Shader
    
        //Pyramid Shader program
        pyramidShaderProgram = glCreateProgram(); //Creates the Shader program and returns an id
        glAttachShader(pyramidShaderProgram, pyramidVertexShader); //Attaches Vertex shader to the Shader program
        glAttachShader(pyramidShaderProgram, pyramidFragmentShader); //Attaches Fragment shader to the Shader program
        glLinkProgram(pyramidShaderProgram); //Link Vertex and Fragment shaders to the Shader program
    
        //Delete the Vertex and Fragment shaders once linked
        glDeleteShader(pyramidVertexShader);
        glDeleteShader(pyramidFragmentShader);
    
        //Lamp Vertex shader
        GLint lampVertexShader = glCreateShader(GL_VERTEX_SHADER); //Creates the Vertex shader
        glShaderSource(lampVertexShader, 1, &lampVertexShaderSource, NULL); //Attaches the Vertex shader to the source code
        glCompileShader(lampVertexShader); //Compiles the Vertex shader
    
        //Lamp Fragment shader
        GLint lampFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); //Creates the Fragment shader
        glShaderSource(lampFragmentShader, 1, &lampFragmentShaderSource, NULL); //Attaches the Fragment shader to the source code
        glCompileShader(lampFragmentShader); //Compiles the Fragment shader
    
        //Lamp Shader Program
        lampShaderProgram = glCreateProgram(); //Creates the Shader program and returns an id
        glAttachShader(lampShaderProgram, lampVertexShader); //Attach Vertex shader to the Shader program
        glAttachShader(lampShaderProgram, lampFragmentShader); //Attach Fragment shader to the Shader program
        glLinkProgram(lampShaderProgram); //Link Vertex and Fragment shaders to the Shader program
    
        //Delete the lamp shaders once linked
        glDeleteShader(lampVertexShader);
        glDeleteShader(lampFragmentShader);
    
    }
    
    
    /*Creates the Buffer and Array Objects*/
    void UCreateBuffers()
    {
        //Position and Texture coordinate data for 18 triangles
        GLfloat vertices[] = {
    
                            //Positions             //Normals               //Texture Coordinates
    
                            //Back Face             //Negative Z Normals
                             0.0f,  0.5f,  0.0f,     0.0f,  0.0f, -1.0f,    0.5f, 1.0f,
                             0.5f, -0.5f, -0.5f,     0.0f,  0.0f, -1.0f,    0.0f, 0.0f,
                            -0.5f, -0.5f, -0.5f,     0.0f,  0.0f, -1.0f,    1.0f, 0.0f,
    
                            //Front Face            //Positive Z Normals
                             0.0f,  0.5f,  0.0f,     0.0f,  0.0f,  1.0f,    0.5f, 1.0f,
                            -0.5f, -0.5f,  0.5f,     0.0f,  0.0f,  1.0f,    0.0f, 0.0f,
                             0.5f, -0.5f,  0.5f,     0.0f,  0.0f,  1.0f,    1.0f, 0.0f,
    
                             //Left Face            //Negative X Normals
                             0.0f,  0.5f,  0.0f,    -1.0f,  0.0f,  0.0f,    0.5f, 1.0f,
                            -0.5f, -0.5f, -0.5f,    -1.0f,  0.0f,  0.0f,    0.0f, 0.0f,
                            -0.5f, -0.5f,  0.5f,    -1.0f,  0.0f,  0.0f,    1.0f, 0.0f,
    
                             //Right Face           //Positive X Normals
                             0.0f,  0.5f,  0.0f,     1.0f,  0.0f,  0.0f,    0.5f, 1.0f,
                             0.5f, -0.5f,  0.5f,     1.0f,  0.0f,  0.0f,    0.0f, 0.0f,
                             0.5f, -0.5f, -0.5f,     1.0f,  0.0f,  0.0f,    1.0f, 0.0f,
    
                             //Bottom Face          //Negative Y Normals
                            -0.5f, -0.5f, -0.5f,     0.0f, -1.0f,  0.0f,    0.0f, 1.0f,
                             0.5f, -0.5f, -0.5f,     0.0f, -1.0f,  0.0f,    0.0f, 0.0f,
                            -0.5f, -0.5f,  0.5f,     0.0f, -1.0f,  0.0f,    1.0f, 1.0f,
                            -0.5f, -0.5f,  0.5f,     0.0f, -1.0f,  0.0f,    1.0f, 1.0f,
                             0.5f, -0.5f, -0.5f,     0.0f, -1.0f,  0.0f,    0.0f, 0.0f,
                             0.5f, -0.5f,  0.5f,     0.0f, -1.0f,  0.0f,    1.0f, 0.0f,
    
        };
    
    
        //Generate buffer ids
        glGenVertexArrays(1, &PyramidVAO);
        glGenBuffers(1, &VBO);
    
        //Activate the PyramidVAO before binding and setting VBOs and VAPs
        glBindVertexArray(PyramidVAO);
    
        //Activate the VBO
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //Copy vertices to VBO
    
        //Set attribute pointer 0 to hold position data
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
        glEnableVertexAttribArray(0); //Enables vertex attribute
    
        //Set attribute pointer 1 to hold Normal data
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
        glEnableVertexAttribArray(1);
    
        //Set attribute pointer 2 to hold Texture coordinate data
        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
        glEnableVertexAttribArray(2);
    
        glBindVertexArray(0); //Unbind the pyramid VAO
    
        //Generate buffer ids for lamp (smaller pyramid)
        glGenVertexArrays(1, &LightVAO); //Vertex Array for pyramid vertex copies to serve as light source
    
        //Activate the Vertex Array Object before binding and setting any VBOs and Vertex Attribute Pointers
        glBindVertexArray(LightVAO);
    
        //Referencing the same VBO for its vertices
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
    
        //Set attribute pointer to 0 to hold Position data (used for the lamp)
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
        glEnableVertexAttribArray(0);
        glBindVertexArray(0);
    
    }
    
    /*Generate and load the texture*/
    void UGenerateTexture(){
    
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
    
        int width, height;
    
        unsigned char* image = SOIL_load_image("brick.jpg", &width, &height, 0, SOIL_LOAD_RGB); //Loads texture file
    
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        glGenerateMipmap(GL_TEXTURE_2D);
        SOIL_free_image_data(image);
        glBindTexture(GL_TEXTURE_2D, 0); //Unbind the texture
    }
    
    /*标题包含*/
    #包括
    #包括
    #包括
    //GLM数学标题包含
    #包括
    #包括
    #包括
    //土壤图像加载器
    #包括“SOIL2/SOIL2.h”
    使用名称空间std//标准名称空间
    #定义窗口标题“金字塔”//窗口标题宏
    /*着色器程序宏*/
    #ifndef GLSL
    #定义GLSL(版本,源)“#版本”#版本“\n”#源
    #恩迪夫
    /*着色器、窗口大小初始化、缓冲区和数组对象的变量声明*/
    闪烁棱锥体着色器程序,灯着色器程序,窗宽=800,窗高=600;
    GLuint VBO、PyramidVAO、LightVAO、纹理;
    //学科地位和规模
    glm::vec3金字塔位置(0.0f,0.0f,0.0f);
    glm::vec3金字塔标度(2.0f);
    //金字塔与浅色
    glm::vec3 objectColor(1.0f、1.0f、1.0f);
    glm::vec3 lightColor(1.0f、1.0f、1.0f);
    //灯光位置和比例
    glm::vec3光位置(0.5f,0.5f,-3.0f);
    glm::vec3光标度(0.3f);
    //摄像机位置
    glm::vec3摄像机位置(0.0f,0.0f,-6.0f);
    //摄像机旋转
    浮动摄影机旋转=glm::弧度(-25.0f);
    /*功能原型*/
    无效UResizeWindow(int,int);
    无效图形(无效);
    void-UCreateShader(void);
    无效缓冲区(void);
    void-ugenettexture(void);
    /*金字塔顶点着色器源代码*/
    常量GLchar*pyramidVertexShaderSource=GLSL(330,
    布局(位置=0)在vec3位置;//顶点属性指针0中的顶点数据
    vec3法线中的布局(位置=1)//法线的VAP位置1
    vec2纹理坐标中的布局(位置=2);
    out vec3 FragmentPos;//用于输出颜色/像素到片段着色器
    out vec3 Normal;//用于将传出法线转换为片段着色器
    out vec2 MOBILETEXTEROCORCOLDING;
    //变换矩阵的全局变量
    统一mat4模型;
    统一mat4视图;
    均匀mat4投影;
    void main(){
    gl_Position=projection*view*model*vec4(位置,1.0f);//将顶点转换为剪辑坐标
    FragmentPos=vec3(model*vec4(位置,1.0f));//仅获取世界空间中的片段/像素位置(排除视图和投影)
    Normal=mat3(转置(逆(模型)))*Normal;//仅获取世界空间中的法向量并排除法向转换属性
    MobileTextureCoordination=vec2(textureCoordinate.x,1-textureCoordinate.y);//水平翻转纹理
    }
    );
    /*金字塔碎片着色器源代码*/
    常量GLchar*pyramidFragmentShaderSource=GLSL(330,
    在vec3 FragmentPos中;//用于传入片段位置
    在vec3法线中;//用于传入法线
    在vec2 MobileTextureCoordinal中;
    out vec4 pyramidColor;//用于将棱锥体颜色输出到GPU
    out vec4 gpuTexture;//将颜色数据传递给GPU的变量
    //对象颜色、灯光颜色、灯光位置和摄影机/视图位置的统一/全局变量
    均匀的vec3颜色;
    均匀的vec3浅色;
    均匀vec3-lightPos;
    统一的vec3视点;
    uniform sampler2D uTexture;//在处理多个纹理时非常有用
    void main(){
    /*Phong照明模型计算以生成环境光、漫反射和镜面反射组件*/
    //计算环境照明
    浮动环境强度=0.1f;//设置环境或全局照明强度
    vec3 ambient=ambientStrength*lightColor;//生成环境光颜色
    //计算漫反射照明
    vec3 norm=normalize(Normal);//将向量规格化为1个单位
    vec3 lightDirection=规格化(lightPos-FragmentPos);//计算光源和屏幕上的碎片/像素之间的距离(灯光方向)
    float impact=max(点(norm,lightDirection),0.0);//通过生成法线和灯光的点积来计算漫反射影响
    vec3 diffuse=impact*lightColor;//生成漫反射光颜色
    //计算镜面照明
    浮动镜面反射强度=0.8f;//设置镜面反射光强度
    float highlightSize=128.0f;//设置镜面反射高光大小
    vec3 viewDir=规格化(viewPosition-FragmentPos);//计算视图方向
    vec3 reflectDir=反射(-lightDirection,norm);//计算反射向量
    //计算镜面反射分量
    float specularComponent=pow(最大值(点(viewDir,反射DIR),0.0),highlightSize);
    vec3镜面反射=镜面反射强度*镜面反射组件*浅色;
    //计算phong结果
    vec3 phong=(环境光+漫反射光+镜面反射)*对象颜色;
    pyramidColor=vec4(phong,1.0f);//将照明结果发送到GPU
    gpuTexture=纹理(uTexture,mobiletexturecoordination);
    }
    );
    /*灯着色器源代码*/
    常量GLchar*lampVertexShaderSource=GLSL(330,
    布局(位置=0)在vec3位置;//顶点位置数据的VAP位置0
    //变换矩阵的统一/全局变量
    统一mat4模型;
    统一mat4视图;
    均匀mat4投影;
    vo
    
    //Calculate phong result
    vec3 objectColor = texture(uTexture, mobileTextureCoordinate).xyz;
    vec3 phong = (ambient + diffuse) * objectColor + specular;
    pyramidColor = vec4(phong, 1.0f); //Send lighting results to GPU
    
    uTextureLoc = glGetUniformLocation(pyramidShaderProgram, "uTexture");
    glUniform1i(uTextureLoc, 0); // texture unit 0
    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glDrawArrays(GL_TRIANGLES, 0, 18);