C++ 无法对位于半透明纹理表面后面的立方体应用混合

C++ 无法对位于半透明纹理表面后面的立方体应用混合,c++,opengl,shader,textures,blending,C++,Opengl,Shader,Textures,Blending,根据关于使用混合渲染半透明windows眼镜的教程,我尝试将该原理应用到我的简单场景中,在该场景中,我们可以使用包含以下内容的鼠标导航场景: 立方体:6个面,每个面有2个三角形,使用其关联顶点着色器中定义的两个属性位置和颜色构造,并传递给其片段着色器。 草:二维曲面使用二维均匀采样应用png纹理的两个三角形png图像的背景是透明的。 窗口:基于与上面草相同的着色器顶点和片段的半透明二维曲面。这两种纹理都是从learnopengl.com下载的 我面临的问题是,当谈到草地时,我可以透过窗户看到它,

根据关于使用混合渲染半透明windows眼镜的教程,我尝试将该原理应用到我的简单场景中,在该场景中,我们可以使用包含以下内容的鼠标导航场景:

立方体:6个面,每个面有2个三角形,使用其关联顶点着色器中定义的两个属性位置和颜色构造,并传递给其片段着色器。 草:二维曲面使用二维均匀采样应用png纹理的两个三角形png图像的背景是透明的。 窗口:基于与上面草相同的着色器顶点和片段的半透明二维曲面。这两种纹理都是从learnopengl.com下载的 我面临的问题是,当谈到草地时,我可以透过窗户看到它,但不能透过立方体看到它

我的代码结构如下:我故意将窗口的渲染保留到最后一个:

//启用深度测试和混合 glEnableGL_深度试验; glEnableGL_混合物; glBlendFuncGL_SRC_ALPHA,GL_ONE_减去DST_ALPHA; 尽管如此: glClearColorbackground.r,background.g,background.b,background.a; glClearGL_颜色_缓冲_位| GL_深度_缓冲_位; cube.draw; 草。画; window.draw; 编辑:我将在下面共享用于绘制两个纹理曲面(草和窗)的顶点和片段着色器:

版本130 在vec2位置; 在vec2中,纹理协调; //opengl转换矩阵 统一mat4模型;//对象坐标->世界坐标 统一mat4视图;//世界坐标->摄像机坐标 均匀mat4投影;//摄像机坐标->国家数据中心坐标 输出矢量2纹理坐标垂直; 真空总管{ gl_位置=投影*视图*模型*矢量4位置,0.0,1.0; 纹理坐标=纹理坐标; } 版本130 在vec2中,纹理协调垂直; 均匀的2D纹理2d; 输出vec4颜色输出; 真空总管{ vec4颜色=纹理纹理2D,纹理坐标垂直; //管理透明度 如果color.a==0.0 丢弃 颜色=颜色; } 以及用于渲染彩色立方体的:

版本130 在vec3位置; vec3颜色; //opengl转换矩阵 统一mat4模型;//对象坐标->世界坐标 统一mat4视图;//世界坐标->摄像机坐标 均匀mat4投影;//摄像机坐标->国家数据中心坐标 输出vec3颜色垂直; 真空总管{ gl_位置=投影*视图*模型*矢量4位置,1.0; 颜色=颜色; } 版本130 在vec3颜色垂直; 输出vec4颜色输出; 真空总管{ 颜色输出=向量4颜色垂直,1.0; } 注:我的着色器程序使用GLSL v1.30,因为我的内部GPU似乎不支持更高版本

关于绘制实际图形的代码,我基本上有一个渲染器类的实例,用于每种类型的几何体,一个由两个纹理曲面共享,另一个用于立方体。该类管理VAO的创建/绑定/删除和VBO的绑定/删除创建类外的VBO,以便我可以共享具有类似形状的顶点。其构造函数将着色器程序和顶点属性作为参数。我将尝试在下面展示相关的代码

渲染器::渲染器程序,矢量属性{ vao.bind; vbo.bind; 定义_属性属性属性; vao.unbind; vbo.unbind; } 制服{ vao.bind; 程序使用; 设置_uniforms或msunforms; glDrawArraysGL_三角形,0,n_顶点; vao.unbind; program.unuse; }
混合函数取决于目标的alpha通道GL_ONE_减去DST_alpha:

glBlendFuncGL_SRC_ALPHA,GL_ONE_减去DST_ALPHA; dest=src*src\u alpha+dest*1-dest\u alpha 如果立方体的alpha通道为0.0,则立方体的颜色不会与窗口的颜色混合

传统的alpha混合功能仅取决于源alpha通道:

glBlendFuncGL_SRC_ALPHA,GL_ONE_减去SRC_ALPHA; dest=src*src\u alpha+dest*1-src\u alpha
另请参见和

混合功能取决于目标的alpha通道GL_ONE_减去DST_alpha:

glBlendFuncGL_SRC_ALPHA,GL_ONE_减去DST_ALPHA; dest=src*src\u alpha+dest*1-dest\u alpha 如果立方体的alpha通道为0.0,则立方体的颜色不会与窗口的颜色混合

传统的alpha混合功能仅取决于源alpha通道:

glBlendFuncGL_SRC_ALPHA,GL_ONE_减去SRC_ALPHA; dest=src*src\u alpha+dest*1-src\u alpha
另请参见和

不,透过窗户可以看到草,透过窗户看不到的是立方体。请看一下我的编辑,我已经添加了我的着色器程序,以及有关如何完成渲染的更多详细信息@rabbi76no,草可以通过窗口看到,而立方体不能通过窗口看到。请看一下我的编辑,我已经添加了我的着色器程序以及有关如何完成渲染的更多详细信息@rabbi76非常感谢,我不够小心。这实际上解释了我为什么要
在草地表面的中间有一个与窗口颜色相同的区域,因为这些像素在目标的纹理图像中是完全不透明的。@Hakim谢谢。不用客气。非常感谢,我不够小心。它实际上解释了为什么我在草地表面中间有一个与窗口颜色相同的区域,因为这些像素在目的地的纹理图像中是完全不透明的。不客气。