固定関数パイプラインを使用して、テクスチャの強度を係数1.0より上にスケーリングするマルチテクスチャリングまたはマルチパスレンダリング以外の方法はありますか?
マルチパスレンダリングで実現できます。たとえば、ファクター1.5は、テクスチャを1回フル強度でレンダリングし、次に加法ブレンドを使用して2回目にcolor(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;
}