【发布时间】:2017-03-24 17:39:09
【问题描述】:
所以,我的目标是绘制具有半透明像素的精灵。
首先,我使用仅渲染不透明像素的着色器渲染精灵。然后,我禁用深度缓冲区写入并使用仅渲染半透明(或透明精灵)的着色器渲染相同的精灵,如下所述:
这是我用作测试的动画精灵表:
https://i.stack.imgur.com/MMs2W.png
这是我的渲染器更新功能:
updateRenderData();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glUseProgram(_programID);
render();
glDepthMask(GL_FALSE);
glUseProgram(_translucencyPogramID);
render();
_window->SwapBuffers();
这是我的渲染函数(以防你想知道我如何渲染精灵):
GLint baseInstance = 0;
GLsizei spriteCount;
for (int i = 0; i < _spriteManager->GetSpriteBatchVector()->size(); i++)
{
_SpriteBatch* spriteBatch = _spriteManager->GetSpriteBatchVector()->at(i);
setTexture(spriteBatch->GetTexture());
spriteCount = (GLsizei)spriteBatch->GetSpriteVector()->size();
glDrawElementsInstancedBaseInstance(_quad.renderMode, _quad.indexCount, _quad.indexDataType, 0, spriteCount, baseInstance);
baseInstance += spriteCount;
}
但是当我执行这段代码时,它只渲染半透明像素: https://i.stack.imgur.com/f4AY6.png
事实上,如果我删除第二个 render() 调用(仅调用,我仍然更改着色器并将深度蒙版设置为 false),则没有任何渲染(黑屏),如下所示:
updateRenderData();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glUseProgram(_programID);
render();
glDepthMask(GL_FALSE);
glUseProgram(_translucencyPogramID);
_window->SwapBuffers();
但如果我在第一次渲染后不更改着色器也不将 glDepthMask 设置为 false,它会正确渲染我的精灵的不透明像素。
编辑: 这是我用于第二遍的片段着色器:
out layout(location = 0) vec4 outColor;
in vec2 texCoord;
uniform sampler2D tex;
void main()
{
vec4 texel = texture(tex, texCoord);
if(texel.a == 1)
{
discard;
}
outColor = texel;
}
第一遍是一样的,但如果 alpha
所以,我的问题是:这是什么原因造成的?
编辑 2:
为了澄清,这个渲染正确(没有半透明像素):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glUseProgram(_programID);
render();
这根本不渲染:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glUseProgram(_programID);
render();
glDepthMask(GL_FALSE);//Just added this line
而且这也根本不渲染:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
glUseProgram(_programID);
render();
glUseProgram(_translucencyPogramID);//Just added this line
【问题讨论】:
-
你的着色器是什么样子的?
-
以上代码都不会导致您按原样显示。了解您为什么有 2 个着色器会有所帮助?
-
"首先,我使用仅渲染不透明像素的着色器渲染精灵。然后,我禁用深度缓冲区写入并使用仅渲染半透明(或透明精灵)的着色器渲染相同的精灵”。也许这不是最好的方法,但我想尝试一下。
-
而且是的,这只是更复杂的渲染系统的一小部分,但它太复杂了,不能放在这里。问题是为什么在渲染后使用 glDepthMask(GL_FALSE) 和 glUseProgram(_translucencyPogramID) 会影响渲染。
-
所以你想画完全不透明的鸟,然后在上面画半透明的红色背景?
标签: c++ opengl 2d rendering sprite