我试图在谷歌上研究这个问题,但似乎没有任何连贯的简单答案.这是因为它不简单,还是因为我没有使用正确的关键字?
然而,这是我迄今取得的进步.
init类似于以下内容:
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, textureIds);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
int i, j;
GLubyte pixel;
for (i = 0; i < TEXTURE_HEIGHT; i++)
{
for (j = 0; j < TEXTURE_WIDTH; j++)
{
pixel = ((((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255);
texture[i][j][0] = pixel;
texture[i][j][1] = pixel;
texture[i][j][2] = pixel;
texture[i][j][3] = 200;
}
}
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glTexParameterf(GL_TEXTURE_2D, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下简单的技术来实现对象独立透明度(OIT):
对不透明和透明物体进行排序。
渲染不透明并写入深度。
禁用深度写入、启用 Alpha 混合并渲染透明对象。
如果我只有完全不透明和透明的对象,它就可以工作。但是如果某些对象具有透明的 Alpha 纹理(我的所有网格都是平面的)并且需要 Alpha 混合,而其他对象是透明的,那么情况又如何呢?这种情况下的例程是什么?目前,如果我首先使用深度写入和 alpha 混合渲染透明,然后使用 alpha 通道纹理渲染对象(深度注销,混合打开),会发生的情况是最后渲染平面的部分与第一个渲染平面相交飞机被淘汰。这是一张描述我所追求的图片:

两个平面都有一定程度的透明度,并且仍然保持深度排序。我知道我可以对 OIT 使用更复杂的方法,就像这样。但是是否可以在不进入片段链表等的情况下做到这一点?
我对 openGL 中的 alpha 混合有疑问...
我已经尝试了一些绘制透明对象的东西......通过在绘制透明面之前禁用 GL_DEPTH_TEST 并在绘制透明面后再次重新启用 GL_DEPTH_TEST ,我看到了一个不错的(理想的)结果......
显然我已经注意到,根据我绘制不同面孔的顺序,我得到了一个结果或另一个......
但是我决定首先在启用 GL_DEPTH_TEST 的情况下绘制实体面,然后在禁用 GL_DEPTH_TEST 的透明面之后...
所以,很明显,如果我在禁用 GL_DEPTH_TEST 的情况下绘制透明面,我会看到内部的透明面(例如立方体),然后
所以,我的问题是......这是正确的吗?OpenGL 是否有一种“神奇”的方式来自动排序不透明和透明的面?
我在 OpenGL 中遇到纹理透明度问题。正如您在下图中看到的,它不太有效。值得注意的是,黑色实际上是 ClearColor,我用来清除屏幕。
我使用以下代码来实现混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
这是我的片段着色器:
#version 330 core
in vec2 tex_coords;
out vec4 color;
uniform vec4 spritecolor;
uniform sampler2D image;
void main(void)
{
color = spritecolor * texture(image, tex_coords);
}
Run Code Online (Sandbox Code Playgroud)
这是线框模式下场景的屏幕截图,以防它有助于绘制顶点:
如果还有什么需要的,可以问我,我会补充的。
我已经学习了一段时间的OpenGL和3D图形,我遇到了众所周知的问题:透明度,半透明度和绘制顺序依赖性.
我知道不同的alpha混合算法:减法,这是最好的,但需要正确的排序; 加法或乘法,与顺序无关,但结果不佳; 禁用z缓冲技术; 等等.
所以,我得到的主要结论是:没有神奇的方法来做透明度.
问题是:如何在现代游戏中实施透明度?我的意思是,在它们中有明确的反对物体:窗户,眼镜等.我想学习这个问题的最佳实践 - 这是如何在"大联盟"中完成的,但我还没有找到任何关于此的论文学科.
渲染这个立方体时,我使用moderngl DEPTH_TEST以正确的深度正确绘制面,效果很好,如图所示:
但是,我想让立方体透明。给它一个稍微透明的纹理后,它的渲染如下:
由于某种原因,立方体正面后面的部分被忽略,导致它只是被染成红色。
这是旋转时的样子:
有些角度有效,有些则无效。
当我禁用深度测试时,所有内容都会正确呈现,但顺序错误。有没有什么办法解决这一问题?(使用Python Moderngl)