openGL固定功能管道 - 比例纹理强度超过1.0

时间:2011-02-11 23:47:53

标签: opengl texturing

除了多纹理或多通道渲染之外,还有一种方法可以使用固定功能管道将纹理强度扩展到系数1.0以上吗?

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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],因此如果需要这种缩放,则应在最后一个纹理单元上应用比例以避免任何剪裁。