相关疑难解决方法(0)

GLSL着色器中的常量浮点值 - 使用制服的任何理由?

我正在查看使用着色器的OpenGL应用程序的来源.一个特殊的着色器看起来像这样:

uniform float someConstantValue;
void main()
{
    // Use someConstantValue
}
Run Code Online (Sandbox Code Playgroud)

统一是从代码设置一次,并且在整个应用程序运行时都不会更改.

在什么情况下我想宣布someConstantValue为a uniform而不是const float

编辑: 只是为了澄清,常数值是物理常数.

opengl shader constants glsl

13
推荐指数
2
解决办法
2万
查看次数

GLSL点内盒测试

下面是一个GLSL片段着色器,如果给定的纹理坐标位于框内,则输出纹素,否则输出颜色.这只是感觉愚蠢,必须有一种方法来做到这一点没有分支?

uniform sampler2D texUnit;

varying vec4 color;
varying vec2 texCoord;

void main() {
  vec4 texel = texture2D(texUnit, texCoord);
  if (any(lessThan(texCoord, vec2(0.0, 0.0))) ||
      any(greaterThan(texCoord, vec2(1.0, 1.0))))
    gl_FragColor = color;
  else
    gl_FragColor = texel;
}
Run Code Online (Sandbox Code Playgroud)

下面是没有分支的版本,但它仍然感觉笨拙."纹理坐标夹紧"的最佳实践是什么?

uniform sampler2D texUnit;

varying vec4 color;
varying vec4 labelColor;
varying vec2 texCoord;

void main() {
  vec4 texel = texture2D(texUnit, texCoord);
  bool outside = any(lessThan(texCoord, vec2(0.0, 0.0))) ||
                 any(greaterThan(texCoord, vec2(1.0, 1.0)));
  gl_FragColor = mix(texel*labelColor, color,
                     vec4(outside,outside,outside,outside));
}
Run Code Online (Sandbox Code Playgroud)

这是渲染结果

我将纹素夹在区域中,标签是 - 在这种情况下,纹理s&t坐标将介于0和1之间.否则,我使用棕色,而标签不是.

请注意,我还可以构建代码的分支版本,在不需要时执行纹理查找.这会比总是执行纹理查找的非分支版本更快吗?也许是时候进行一些测试......

opengl glsl

7
推荐指数
2
解决办法
3419
查看次数

标签 统计

glsl ×2

opengl ×2

constants ×1

shader ×1