openGL固定函数管道-缩放纹理强度超过1.0

openGL固定函数管道-缩放纹理强度超过1.0,opengl,texturing,Opengl,Texturing,除了多纹理渲染或多通道渲染之外,是否有其他方法可以使用固定函数管道将纹理的强度缩放到因子1.0以上 它可以通过多通道渲染来实现。例如,因子1.5可以通过在全强度下渲染纹理一次,然后使用添加混合第二次使用颜色0.5,0.5,0.5,1.0来实现 但是,是否也有一种方法可以通过一次传递而不使用多文本来实现这一点呢?我假设您使用的是OpenGL 3.0或OpenGL ES库。我认为你可以这样做,尽管我不确定它是否得到支持 这应该比我最初的答案更受支持,但你仍然坚持使用1.5作为调制值 // Setup

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

它可以通过多通道渲染来实现。例如,因子1.5可以通过在全强度下渲染纹理一次,然后使用添加混合第二次使用颜色0.5,0.5,0.5,1.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;
}

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

这看起来很棒!有没有办法让因子1.5穿过一些顶点心房?这样我就可以为不同的多边形创建不同的强度工厂,而不必为每个多边形发出单次绘制调用?我使用的是openGL ES 1.5,着色器不是available@Mat没有像OpenGL ES 1.5这样的东西,只有ES 1.1和ES 2.0存在。glTexEnv的openGL引用声明颜色值被钳制为[0,1]-是否仍有可能?openGL纹理组合器无法访问顶点值。混淆OpenGLES1.1和OpenGL1.5是可以理解的错误;前者源自后者。如果您必须使用OpenGLES1.1,那么这意味着您使用的是固定功能硬件。它不能按照您希望的方式进行编程。