2016-04-06 21 views
0

現在、私は1つの色(赤色)を返す単純なフラグメントシェーダを持っています。私はCのコードから別のRGBAの色を変更したい場合は、どうすればいいのですか?OpenGLフラグメントシェーダ - 固定カラーの変更

フラグメントシェーダ内の属性をCから直接変更することはできますか?または、頂点シェーダのソリッドカラー属性を変更してから、そのカラーをフラグメントシェーダに渡す必要がありますか?私は単一の単色の四角形を描画しています - 何も特別なものはありません。

void main() 
{ 
    gl_FragColor = vec4(1.0, 0, 0, 1);" 
} 

答えて

2

あなたは、あなたがラインに色を挿入する機能をフォーマットCの文字列を使用することができ、実行時にシェーダを生成する話をしている場合は、「gl_FragColor ...」

私はあなたがお勧めしませんこれは不必要な作業になるためです。これを行うための標準的な方法は、ユニフォームを次のように使用することです。

// fragment shader: 
uniform vec3 my_color; // A UNIFORM 

void main() 
{ 
    gl_FragColor.rgb = my_color; 
    gl_FragColor.a = 1; // the alpha component 
} 

// your rendering code: 
glUseProgram(SHADER_ID); 
.... 
GLint color_location = glGetUniformLocation(SHADER_ID, "my_color"); 
float color[3] = {r, g, b}; 
glUniform3fv(color_location, 1, color); 
.... 
glDrawArrays(....); 
+0

ありがとうございます。残念ながら、私の長方形は常に黒です。 GLuint hColor = glGetUniformLocation(g_SolidProgram、 "vColor4"); フラグメントシェイダーにも同じ変更を加えましたが、シェーダーのコンパイルに失敗したため、1ではなく1.0を使用しなければなりませんでした。 GLfloat color [3] = {1.0、1.0、0.0}; glUniformMatrix3fv(hColor、1、GL_FALSE、color); – SparkyNZ

+0

glUniformMatrix3fv(hColor、1、GL_FALSE、color); "glUniform3fv(hColor、1、color);"にする必要があります。注:_glUniformMatrix3fv_は行列の** ONLY **、_glUniform3fv_はベクトルのものです – Jas

+0

優秀!私はあなたの答えを受け入れました。私を助けてくれてありがとう。 'マトリックス'のビットを見ていない:) – SparkyNZ

関連する問題