0

除了多纹理或多通道渲染之外,还有其他方法可以使用固定功能管道将纹理的强度缩放到因子 1.0 以上吗?

它可以通过多通道渲染来实现。例如,因子 1.5 可以通过一次以全强度渲染纹理,然后使用加色混合第二次使用颜色(0.5,0.5,0.5,1.0)来实现。

但是还有一种方法可以通过单次传递而无需多重纹理来实现这一目标吗?

4

2 回答 2

0

我假设您使用的是 OpenGL 3.0 或 OpenGL ES 库。我认为你可以做这样的事情,但我不确定它的支持程度。

这应该比我原来的答案更受支持,但你坚持使用 1.5 作为调制值。

// Setup...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);

// Combine: Result.rgb = Texture + Texture - 0.5
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

// Combine: Result.a = Texture
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

如果你可以使用着色器来做到这一点,你会更好:

//Fragment shader
uniform sampler2D texture;
uniform float blend;
varying vec2 texcoord;
void main()
{
   vec4 texel0 = texture2D(texture, texcoord);
   texel0 *= blend;
   gl_FragColor = texel;
}
于 2011-02-12T00:52:23.287 回答
0

您可以使用纹理环境的GL_RGB_SCALEGL_ALPHA_SCALE属性来应用 2 倍或 4 倍比例因子,但这需要您使用GL_COMBINE纹理环境模式而不是预定义模式。要获得 1.5 的比例因子,您需要设置GL_RGB_SCALE为 2.0 并将颜色设置为 {0.75, 0.75, 0.75, 1.0}。请注意,每个纹理单元的纹理环境仍然钳制为 [0, 1],因此如果您需要这种类型的缩放,您应该在最后一个纹理单元上应用缩放以避免任何裁剪。

于 2011-02-14T01:31:51.963 回答