2016-08-18 5 views
-2

私のopenglシェーダで私のユニフォームの適切な場所を取得することに問題があります。私はいつもいつも常にglGetUniformLocation関数から-1を返します。opengl getUniformLocation

多分私はそれをうまく読み込めませんでしたか?

ユニフォームは使用しないために最適化できるとオンラインで読んでいましたが、私のシェイダーに影響を与えるような方法で私のユニフォームを使用しています(または私はそう思います)。 また、stackoverflowや他のサイトでこの問題に関連する回答が出るたびに、彼らはこの事実について話しますが、これに対する代替的な解決策については一つも述べていません。新しいOpenGLイテレーションのためだけに新しいものですか?ここ

は、私の頂点シェーダコードです:ここ

#version 410 core             

in vec4 position;                                
uniform mat4 mvmatrix;            
uniform mat4 projmatrix;           

void main(void)              
{                 
    gl_Position = projmatrix * mvmatrix * position;    
} 

は私のフラグメントシェーダコードです:

#version 410 core             

out vec4 color;              



void main(void)              
{                 
    color = vec4(1.0,1.0,1.0,1.0)         
}                 

、ここでは、今、私が実装didntの全体program..forのための全体のソースコードですコード全体、プログラムやシェイダーに匹敵する部分だけですが、私はユニフォームの場所を取得するのに苦労しています。私はここ数日間苦労していました。誰かが私をここで救うことを望んでいた:

codeHere

も、あなたはイムが話していることを特定の部分のみが必要な場合:

//creating program and shaders, compiling shaders, compiling program 
GLchar * v_Shader[] = { 


    "#version 410 core             \n" 
    "                 \n" 
    "in vec4 position;             \n" 
    "                 \n" 
    "                 \n" 
    "uniform mat4 mvmatrix;           \n" 
    "uniform mat4 projmatrix;           \n" 
    "                 \n" 
    "void main(void)             \n" 
    "{                 \n" 
    " gl_Position = proj_matrix * mv_matrix * position;    \n" 
    "}                 \n" 
}; 

GLchar * f_Shader[] = { 
    "#version 410 core             \n" 
    "                 \n" 
    "out vec4 color;             \n" 
    "                 \n" 
    "in VS_OUT               \n" 
    "{                 \n" 
    " vec4 color;             \n" 
    "} fs_in;               \n" 
    "                 \n" 
    "void main(void)             \n" 
    "{                 \n" 
    " color = vec4(1.0,1.0,1.0,1.0)         \n" 
    "}                 \n" 
}; 

//creating a opengl program 
program = glCreateProgram(); 

//creating the vertex shader and compiling it 
vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, 1, v_Shader, NULL); 
glCompileShader(vertexShader); 

//creating the fragment shader and compiling it 
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, 1, f_Shader, NULL); 
glCompileShader(fragmentShader); 

//attaching the shaders to the program and linking the program 
glAttachShader(program, vertexShader); 
glAttachShader(program, fragmentShader); 
glLinkProgram(program); 
glUseProgram(program); 
//getting the program's uniform locations 
modelViewMatrixLocation = glGetUniformLocation(program, "mvmatrix"); 
projectionMatrixLocation = glGetUniformLocation(program, "projmatrix"); 

をそしていいえ、私はGLFW/SDL/GLEW/freeglutまたは他のライブラリを使用して好きではありません。彼らはまったく私を混乱させます。 、修正将来的にこのようなエラーをキャッチするために

gl_Position = projmatrix * mvmatrix * position; 

gl_Positionラインを置き換え、シェーダコンパイルのステータスを確認するには

uniform mat4 mvmatrix; 
uniform mat4 projmatrix; 
... 
gl_Position = proj_matrix * mv_matrix * position; 

:あなたは頂点シェーダで均一名スペルミスです

+1

です。コンパイルとリンクの段階が成功したかどうかを確認する必要があります。そうでない場合は、プログラムを使用することはできません。それで-1は常に – Amadeus

答えて

1

GLint wasCompiled; 
glGetShaderiv(shader, GL_COMPILE_STATUS, &wasCompiled); 
GLint logLength; 
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); 
if (logLength > 0) 
{ 
    GLchar* log = new GLchar[ (std::size_t)logLength + 1 ]; 
    GLsizei charsWritten = 0;    
    glGetShaderInfoLog(shader, logLength, &charsWritten, log); 
    std::cout << std::string(log); 
} 

フラグメントシェーダーにも構文エラーがあります:

color = vec4(1.0,1.0,1.0,1.0)  

最後に;がありません。シェーダのコンパイルエラーをチェックする必要があります。

フラグメントシェーダは、頂点シェーダからの入力としてカラーを取りますが、頂点シェーダはそれを出力せず、フラグメントシェーダではカラー入力を使用しません。修正するには、これらの行を削除します。

color = vec4(1.0,0.0,0.0.1.0) 

は、2個のエラーがあります:

"in VS_OUT               \n" 
"{                 \n" 
" vec4 color;             \n" 
"} fs_in;               \n" 

のコメントで、最新バージョンでは、ラインを持っています。;がありません。1.0より前の文字は,ではなく、.

+0

でした。まだ-1を得ています。 – BinaryKiller

+0

ここに更新コードがあります: – BinaryKiller

+0

http://pastebin.com/LUHfMj98 – BinaryKiller