OpenGLはGLSL(Shader)でカラーテーブルで塗りつぶします


ゲームをするとき、特に2 Dゲームでは、人物のアニメーションは多くの画像を切断して構成されることが多く、これらの画像が異なる色で異なるスタイルを作りたい場合、画像の数が倍増します.
これにより、リソースの消費量が多すぎるという問題が発生します.
これにより、インデックスマップを用いて異なる色表を組み合わせることで、画像のセット、多様な効果を達成できる機能
しかし,インデックスマップとカラーテーブルを組み合わせる場合,あらかじめインデックスピクチャを塗りつぶしておき,同様に多くのメモリを消費するが,SDLのような塗りつぶし機能付きエンジンを用いてリアルタイムでピクチャを生成すると,塗りつぶし,削除効率があまりよくない.
GLSLのクリップシェーダを使用すると、画像から生成されたテクスチャに基づいて早く色を塗ることができます.
具体的な操作は以下の通りです.
(事前に宣言して、方法は唯一ではありませんが、私が今GLSLで色を塗っているときは、効率がいいので、みんなと分かち合います)
1.頂点シェーダが必要です.
void main(void)
{
        gl_Position = ftransform(); //    
        gl_TexCoord[0]=gl_MultiTexCoord0; //    

}

2.クリップシェーダ(Clip Shader)
uniform vec3 color_value[256];//         
uniform sampler2D sampler0;//        

void main(void)
{

int index; //  
 vec3 color; //    

vec4 clrIndex =texture2D(sampler0,vec2(gl_TexCoord[0])); //   
 
index=clrIndex[0]*255; //     

 color.rgb=color_value[index]/255.0; //               

gl_FragColor=color;
}

3.プログラムでの呼び出し例
GLint uniformLoc = 0;
//  
  GLfloat* palPtr = LoadPalette(szPaletteFile); //              
if (palPtr)
{
glUseProgram(myProgram); //  myProgram       program
if ((uniformLoc = glGetUniformLocation(myProgram,"sampler0")) != -1)
glUniform1i(uniformLoc, 0);
if ((uniformLoc = glGetUniformLocation(myProgram,"color_value")) != -1)
glUniform3fv(uniformLoc,256,palPtr);
}
   
glBegin(GL_QUADS);
glColor4ub(red,green,blue,alpha);
glTexCoord2f(texL,texB);glVertex3f(l, b, sprPrior);
glTexCoord2f(texR,texB);glVertex3f(r, b, sprPrior);
glTexCoord2f(texR,texT);glVertex3f(r, t, sprPrior);
glTexCoord2f(texL,texT);glVertex3f(l, t, sprPrior);
glEnd();

//例として使用するコードの一部のみを表示
//また、この塗りはテクスチャをスケーリングした後、色が間違っている問題が発生することを発見しました.原因は不明です.これも私がこの文章を送った主な原因です.助けてほしいです.