gpt4 book ai didi

opengl - GLSL Gif 抖动效果 : Optimization

转载 作者:行者123 更新时间:2023-12-01 19:37:08 24 4
gpt4 key购买 nike

Image of shader result

我有一个片段着色器,它本质上读取颜色 alpha 并将其转换为跨像素的抖动效果。

但是,所有 mod 和 if 语句都非常消耗处理器资源。有人对优化下面的代码有什么建议吗?

varying vec2 the_uv;
varying vec4 color;

void main()
{
// The pixel color will correspond
// to the uv coords of the texture
// for the given vertice, retrieved
// by the Vertex shader through varying vec2 the_uv

gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
vec4 tex = texture2D(_MainTex, the_uv);
tex = tex * color ;
float r = tex.a;

if ( r > 0.1 ) {
if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {
gl_FragColor = color;
}
}

if ( r > 0.5 ) {
if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {
gl_FragColor = color;
}
}

if ( r > 0.7 ) {
if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {
gl_FragColor = color;
}
}

if ( r > 0.9 ) {
if ( ( mod(gl_FragCoord.x + 1.0, 4.001) + mod(gl_FragCoord.y + 1.0, 4.0) ) > 6.00 ) {
gl_FragColor = color;
}
}

if ( r > 0.3 ) {
if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {
gl_FragColor = color;
}
}
}

以下是基于反馈的解决方案:

        varying vec2 the_uv;
varying vec4 color;

void main()
{
color = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
the_uv = gl_MultiTexCoord0.st;
}
#endif

#ifdef FRAGMENT
uniform sampler2D _MainTex;
uniform sampler2D _GridTex;
varying vec2 the_uv;
varying vec4 color;

void main()
{
if (texture2D(_MainTex, the_uv).a * color.a > texture2D(_GridTex, vec2(gl_FragCoord.x, gl_FragCoord.y)*.25).a) gl_FragColor = color;
else gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);

}

最佳答案

您想要做的是根据源 Alpha 选择每个像素是否应在 4x4 网格上点亮。最简单的方法就是这样做。

首先使用像素 channel 所需的相应 alpha 初始化 4x4 纹理(我选择 1.0 作为 alpha,因为这里不会显示)

1.0 0.5 1.0 0.1
1.0 1.0 0.9 1.0
1.0 0.3 1.0 0.7
1.0 1.0 1.0 1.0

设置此纹理重复以完全避免 mod,并设置最近的过滤器以避免线性过滤。

然后,使用该纹理的采样来决定是否点亮像素。

vec4 dither = texture2D(_my4x4, gl_FragCoord / 4.); // 4 is the size of the texture
if (r > dither) { gl_FragColor = color; }

这假设 r 永远不为 1。有一些简单的方法可以解决这个问题,例如将 4x4 纹理中的值除以 2(1.0 除外),然后在 if 测试之前、获取之后将抖动乘以 2。

一些进一步的潜在优化:

  • 您可以通过使用具有比较的纹理(阴影纹理)来完全避免 if 测试。
  • 您可以通过使用textureFetch指令来避免/4

关于opengl - GLSL Gif 抖动效果 : Optimization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com