|
@@ -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;
|