Browse Source

V0.7.7
1、添加了多个纹理,但是显示暂时还未成功

apple 1 month ago
parent
commit
7807cd7291

+ 46 - 7
demo/VideoPlayerGL/GLWidget/PlayerGLWidget2.cpp

@@ -41,23 +41,28 @@ PlayerGLWidget2::PlayerGLWidget2(QWidget *parent) : QOpenGLWidget(parent)
 
     /* 打开着色器代码 */
     QString vertexShaderFile = ":/shader/vertexShader.glsl";
-    if (!loadShader(vertexShaderFile, &m_vertexShaderCode)) {
+    if (!loadShaderCode(vertexShaderFile, &m_vertexShaderCode)) {
         return;
     }
     // SPDLOG_INFO("顶点着色器代码: \n{}", m_vertexShaderCode);
 
     QString fragmentShaderFile = ":/shader/fragmentShader.glsl";
-    if (!loadShader(fragmentShaderFile, &m_fragmentShaderCode)) {
+    if (!loadShaderCode(fragmentShaderFile, &m_fragmentShaderCode)) {
         return;
     }
     // SPDLOG_INFO("片段着色器代码: \n{}", m_fragmentShaderCode);
 
     /* 加载问了图片 */
-    QString imageFile = ":/Image/1.jpg";
+    QString imageFile = ":/Image/image/1.jpg";
     if (!loadImage(imageFile, m_imageTexture)) {
         return;
     }
 
+    QString imageFile2 = ":/Image/image/awesomeface.png";
+    if (!loadImage(imageFile2, m_imageTexture2)) {
+        return;
+    }
+
 }
 PlayerGLWidget2::~PlayerGLWidget2()
 {
@@ -136,8 +141,8 @@ void PlayerGLWidget2::initializeGL()
     /* -------------------------------------------------------------------------------------
      * 纹理对象
      * ------------------------------------------------------------------------------------ */
-    glGenTextures(1, &m_textureID); // 生成纹理对象
-    glBindTexture(GL_TEXTURE_2D, m_textureID); // 绑定纹理对象
+    glGenTextures(1, &m_texture1); // 生成纹理对象
+    glBindTexture(GL_TEXTURE_2D, m_texture1); // 绑定纹理对象
     /* 设置当前绑定的纹理对象的环绕、过滤方式 */
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // S轴环绕方式
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // T轴环绕方式
@@ -159,6 +164,29 @@ void PlayerGLWidget2::initializeGL()
     );
     glGenerateMipmap(GL_TEXTURE_2D); // 生成多级渐远纹理
 
+    glGenTextures(1, &m_texture2); // 生成纹理对象
+    glBindTexture(GL_TEXTURE_2D, m_texture2); // 绑定纹理对象
+    /* 设置当前绑定的纹理对象的环绕、过滤方式 */
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // S轴环绕方式
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // T轴环绕方式
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // 纹理缩小过滤方式
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 纹理放大过滤方式
+
+    /* 纹理数据,最后一个参数是纹理数据的指针,0表示数据在当前上下文中 */
+    /* 纹理数据,最后一个参数是纹理数据的指针 */
+    glTexImage2D(
+        GL_TEXTURE_2D,
+        0,                          // Mipmap 级别
+        GL_RGBA,                    // 纹理内部格式
+        m_imageTexture2.width(),     // 纹理宽度
+        m_imageTexture2.height(),    // 纹理高度
+        0,                          // 边框(必须为 0)
+        GL_RGBA,                    // 数据格式(与 QImage 格式匹配)
+        GL_UNSIGNED_BYTE,           // 数据类型
+        m_imageTexture2.bits()       // 数据指针
+    );
+    glGenerateMipmap(GL_TEXTURE_2D); // 生成多级渐远纹理
+
 
     /* -------------------------------------------------------------------------------------
      * 着色器程序对象
@@ -222,6 +250,10 @@ void PlayerGLWidget2::initializeGL()
     // glBindTexture(GL_TEXTURE_2D, 0); // 解绑纹理对象
     /* 解绑着色器程序对象 */
     // glUseProgram(0); // 解绑着色器程序对象
+
+    /* 指定纹理对象名称 */
+    glUseProgram(m_shaderProgram); // 使用着色器程序对象
+    
 }
 
 void PlayerGLWidget2::resizeGL(int w, int h)
@@ -236,7 +268,14 @@ void PlayerGLWidget2::paintGL()
 
     /* 激活着色器程序对象 */
     glUseProgram(m_shaderProgram);
-    glBindTexture(GL_TEXTURE_2D, m_textureID); // 绑定纹理对象
+    /* 设置纹理单元,0表示第一个纹理单元,1表示第二个纹理单元 */
+    glUniform1i(glGetUniformLocation(m_shaderProgram, "ourTexture1"), 0); // 纹理单元0
+    glUniform1i(glGetUniformLocation(m_shaderProgram, "ourTexture2"), 1); // 纹理单元1
+    /* 激活纹理单元 */
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, m_texture1); // 绑定纹理对象
+    glActiveTexture(GL_TEXTURE1);
+    glBindTexture(GL_TEXTURE_2D, m_texture1); // 绑定纹理对象
     /* 绑定VAO,绘制图形 */
     glBindVertexArray(m_VAO1); // 绑定VAO
 
@@ -255,7 +294,7 @@ void PlayerGLWidget2::paintGL()
  * @return true 
  * @return false 
  */
-bool PlayerGLWidget2::loadShader(const QString &fileName, char** shaderCode)
+bool PlayerGLWidget2::loadShaderCode(const QString &fileName, char** shaderCode)
 {
     if(*shaderCode != nullptr) {
         delete[] *shaderCode;

+ 5 - 2
demo/VideoPlayerGL/GLWidget/PlayerGLWidget2.h

@@ -7,6 +7,7 @@
 #include <cstdint>
 #include <gl/gl.h>
 #include <qchar.h>
+#include <qimage.h>
 
 
 /**
@@ -33,7 +34,7 @@ protected:
 
 private:
     /* 打开GLSL文件,读取着色器代码 */
-    bool loadShader(const QString &fileName, char** shaderCode);
+    bool loadShaderCode(const QString &fileName, char** shaderCode);
     /* 加载图片 */
     bool loadImage(const QString &fileName, QImage &imageTexture);
 
@@ -41,7 +42,8 @@ private:
 
     GLuint m_VAO1 = 0;              // 顶点数组对象的ID
     GLuint m_VBO1 = 0;              // 顶点缓冲对象的ID
-    GLuint m_textureID;             // 纹理对象的ID
+    GLuint m_texture1;              // 纹理对象1
+    GLuint m_texture2;              // 纹理对象2
     GLuint m_EBO1 = 0;              // 索引缓冲对象的ID
     GLuint m_shaderProgram = 0;     // 着色器程序对象的ID
 
@@ -56,6 +58,7 @@ private:
     char* m_fragmentShaderCode = nullptr;   // 片段着色器代码
 
     QImage m_imageTexture;          /* 纹理图片 */
+    QImage m_imageTexture2;         /* 纹理图片2 */
 };
 
 

+ 0 - 0
demo/VideoPlayerGL/1.jpg → demo/VideoPlayerGL/image/1.jpg


BIN
demo/VideoPlayerGL/image/awesomeface.png


+ 2 - 1
demo/VideoPlayerGL/res.qrc

@@ -1,6 +1,7 @@
 <RCC>
     <qresource prefix="/Image">
-        <file>1.jpg</file>
+        <file>image/1.jpg</file>
+        <file>image/awesomeface.png</file>
     </qresource>
     <qresource prefix="/">
         <file>shader/vertexShader.glsl</file>

+ 6 - 4
demo/VideoPlayerGL/shader/fragmentShader.glsl

@@ -1,13 +1,15 @@
 #version 330 core
 
 in vec3 vertexColor;    //输入颜色数据
-in vec2 TexCoord;      //输入纹理坐标数据
+in vec2 TexCoord;       //输入纹理坐标数据
 
-out vec4 FragColor; //输出颜色数据
+out vec4 FragColor;     //输出颜色数据
 
-uniform sampler2D ourTexture; //纹理采样器
+uniform sampler2D ourTexture1; //纹理采样器
+uniform sampler2D ourTexture2; //纹理采样器
 
 void main()
 {
-    FragColor = texture(ourTexture, TexCoord);
+    // FragColor = texture(ourTexture1, TexCoord) * vec4(vertexColor, 1.0); // 乘以颜色
+    FragColor = mix(texture(ourTexture1, TexCoord), texture(ourTexture2, TexCoord), 0.2); // 混合两种纹理
 }