2012-01-20 9 views
1

作業中のプログラムにphongシェーダを追加しようとしています。私はそれが私の前の、シンプルなシェーダのために働いていたので、要素の数が正しいことを知っているデバッグの支援OpenGL glslシェーダまたはそれを使用したコード

glDrawArrays(GL_TRIANGLES, 0, mCubes.getArrayNumberOfElements()); 

:中に:私は私の新しいシェーダを実施した後、基本的に、私のコードは「11セグメンテーションフォールト」を取得します。ここで

は、私の頂点シェーダである:ここでは

// vertex shader 
attribute vec4 vPosition; 
attribute vec3 vNormal; 
varying vec4 color; //vertex shader 
// light and material properties 
uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct; 
uniform mat4 ModelView; 
//uniform mat4 Projection; 
uniform vec4 LightPosition; 
uniform float Shininess; 
vec3 L, H, N, pos, E; 
vec4 diffuse, specular, ambient; 
float Kd, Ks; 

void main() 
{ 
// Transform vertex position into eye coordinates 
pos = (ModelView * vPosition).xyz; 
L = normalize(LightPosition.xyz - pos); 
E = normalize(-pos); 
H = normalize(L + E); 
// Transform vertex normal into eye coordinates 
N = normalize(ModelView*vec4(vNormal, 0.0)).xyz; 
// Compute terms in the illumination equation 
ambient = AmbientProduct; 
Kd = max(dot(L, N), 0.0); 
diffuse = Kd*DiffuseProduct; 
Ks = pow(max(dot(N, H), 0.0), Shininess); 
specular = Ks * SpecularProduct; 
if(dot(L, N) < 0.0) 
specular = vec4(0.0, 0.0, 0.0, 1.0); 

gl_Position = ModelView * vPosition; 
color = ambient + diffuse + specular; 
color.a = 1.0; 
     } 

は、コードが障害を取得して終了した私の表示機能である:

void display(void) { 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

vector<float> cell = mCubes.getCell(); 

mat4 matrix = rot * scale(1.0/cell[0], 1.0/cell[1], 1.0/cell[2]) * translate(-cell[0]/2.0, -cell[1]/2.0, -cell[2]/2.0); 
glUniformMatrix4fv(vShaderModelView, 1, GL_TRUE, matrix); 

glDrawArrays(GL_TRIANGLES, 0, mCubes.getArrayNumberOfElements()); 


glutSwapBuffers(); 
glFlush(); 
} 

そしてここでは、主にセットアップし、私のinit関数であり、シェーダとのやり取り:

void init() { 
// Create a vertex array object 
GLuint vao; 
#ifdef __APPLE__ 
glGenVertexArraysAPPLE(1, &vao); 
glBindVertexArrayAPPLE(vao); 
#else 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
#endif 

// Create and initialize a buffer object 
GLuint buffer; 

glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, 
      mCubes.getDisplayArraySize() + mCubes.getDisplayArraySize()*3,    NULL, GL_STATIC_DRAW); 
GLintptr offset = 0; 
glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getDisplayArraySize(), mCubes.getDisplayArray()); 
offset+= mCubes.getDisplayArraySize(); 

glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getDisplayArraySize(), mCubes.getNormalVector()); 

// Load shaders and use the resulting shader program 
string evname = "PROTCAD3DIR"; 
string path = PCGeneralIO::getEnvironmentVariable(evname); 

path += "/data/shaders/"; 
#ifdef __APPLE__ 
string vshadername = path + "kw_vshader1_mac.glsl"; 
string fshadername = path + "kw_fshader1_mac.glsl"; 
//#else 
// string vshadername = path + "kw_vshader1.glsl"; 
// string fshadername = path + "kw_fshader1.glsl"; 
#endif 

GLuint program = InitShader(vshadername.c_str(), fshadername.c_str()); 

glUseProgram(program); 
// Initialize the vertex position attribute from the vertex shader  
GLuint vShaderPosition = glGetAttribLocation(program, "vPosition"); 
glEnableVertexAttribArray(vShaderPosition); 
glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

GLuint vShaderNormal = glGetAttribLocation(program, "vNormal"); 
glEnableVertexAttribArray(vShaderNormal); 
//glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); //this was the ORIGINAL PROBLEM, now commented out and below is solution 
    glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); 


vShaderModelView = glGetUniformLocation(program, "ModelView"); 
vShaderLightPosition = glGetUniformLocation(program, "LightPosition"); 

vShaderAmbientProduct = glGetUniformLocation(program, "AmbientProduct"); 
vShaderDiffuseProduct = glGetUniformLocation(program, "DiffuseProduct"); 
vShaderSpecularProduct = glGetUniformLocation(program, "SpecularProduct"); 
vShaderShininess = glGetUniformLocation(program, "SpecularProduct"); 
glEnable(GL_DEPTH_TEST); 

vec4 light = vec4(0.5,1.5,1.0,0.0); 
glUniform4fv(vShaderLightPosition, 1, light); 
vec4 amb = vec4(1.0f,0.0f,0.20f,1.0f); 
glUniform4fv(vShaderAmbientProduct, 1, amb); 
vec4 diff = vec4(0.5f,0.5f,0.5f,1.0f); 
glUniform4fv(vShaderDiffuseProduct, 1, diff); 
vec4 spec = vec4(0.80f,0.80f,0.80f,1.0f); 
glUniform4fv(vShaderSpecularProduct, 1, spec); 
float shin = 6.0f; 
glUniform1f(vShaderShininess,shin); 


glClearColor(.2, .2, .2, 1); /* Grey background */ 
} 

質問があればお気軽にお問い合わせください。退ける。私は、頂点シェーダ自体に問題があるか、またはシェーダとやりとりする方法が何かうねったことをしていると感じています。どんな助けや提案も受け入れられます!

EDIT :::(ソリューションを反映するように編集コード)問題は、第二にあった:

glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); 
を愚かなコピー/ペースト間違いだった:

glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); 

読んだことがあるはずです。しかし、完成した製品はまだ正しく見えません!

[回転0で、完全に着色されているようだ] [1]

http://i.stack.imgur.com/CKJ3f.png

[少しの回転は、いくつかの奇妙な振る舞いを明らかに! ] [2]

http://i.stack.imgur.com/kyRfI.png

![さらに回転があなたの髪を抜くためにあなたをリード] [3]

i.stack.imgur.com/lYOzK.png

![4]

i.stack.imgur.com/FZcqF.png

[その後白人うち、あなたは私が!!めちゃくちゃ知っている]を

回転するにつれて、色がねじれて白くなったり、黒くなったり、模様がついたりしますが、これは間違いです。

編集:::これはvNormalと値の間違った金額を渡すの「正しい」問題への私の試みです:

void init() { 
// Create a vertex array object 
GLuint vao; 
#ifdef __APPLE__ 
glGenVertexArraysAPPLE(1, &vao); 
glBindVertexArrayAPPLE(vao); 
#else 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
#endif 

// Create and initialize a buffer object 
GLuint buffer; 
realVec *normArray = new realVec[mCubes.getNormalArraySize()];//vec4 array compared to vec3 array  
normArray = mCubes.getNormalVector(); // new array of normals 

for(int i=0; i<mCubes.getArrayNumberOfElements();i++){ 
    printf("Normal at %d is %f \n",i,normArray[i][0]); //to print normals 
    printf("Normal at %d is %f \n",i,normArray[i][1]); //to print normals 
    printf("Normal at %d is %f \n",i,normArray[i][2]); //to print normals 
} 

glGenBuffers(1, &buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, 
      mCubes.getDisplayArraySize() + mCubes.getNormalArraySize(),    NULL, GL_STATIC_DRAW); //Changed size for vec3 array of normals 
GLintptr offset = 0; 
glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getDisplayArraySize(), mCubes.getDisplayArray()); 
offset+= mCubes.getDisplayArraySize(); 

glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getNormalArraySize(), normArray); 

// Load shaders and use the resulting shader program 
string evname = "PROTCAD3DIR"; 
string path = PCGeneralIO::getEnvironmentVariable(evname); 

path += "/data/shaders/"; 
#ifdef __APPLE__ 
string vshadername = path + "kw_vshader1_mac.glsl"; 
string fshadername = path + "kw_fshader1_mac.glsl"; 
//#else 
// string vshadername = path + "kw_vshader1.glsl"; 
// string fshadername = path + "kw_fshader1.glsl"; 
#endif 

GLuint program = InitShader(vshadername.c_str(), fshadername.c_str()); 

glUseProgram(program); 
//offset =0; 
// Initialize the vertex position attribute from the vertex shader  
GLuint vShaderPosition = glGetAttribLocation(program, "vPosition"); 
glEnableVertexAttribArray(vShaderPosition); 
glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

GLuint vShaderNormal = glGetAttribLocation(program, "vNormal"); 
glEnableVertexAttribArray(vShaderNormal); 
glVertexAttribPointer(vShaderNormal, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); 


//vShaderMatrix = glGetUniformLocation(program, "vMatrix"); 
//vShaderColor = glGetUniformLocation(program, "vColor") 
vShaderModelView = glGetUniformLocation(program, "ModelView"); 
vShaderLightPosition = glGetUniformLocation(program, "LightPosition"); 
//vShaderProjection = glGetUniformLocation(program, "Projection"); 

vShaderAmbientProduct = glGetUniformLocation(program, "AmbientProduct"); 
vShaderDiffuseProduct = glGetUniformLocation(program, "DiffuseProduct"); 
vShaderSpecularProduct = glGetUniformLocation(program, "SpecularProduct"); 
vShaderShininess = glGetUniformLocation(program, "SpecularProduct"); 
glEnable(GL_DEPTH_TEST); 

vec4 light = vec4(0.5,1.5,1.0,0.0); 
glUniform4fv(vShaderLightPosition, 1, light); 
vec4 amb = vec4(1.0f,0.0f,0.20f,1.0f); 
glUniform4fv(vShaderAmbientProduct, 1, amb); 
vec4 diff = vec4(0.5f,0.5f,0.5f,1.0f); 
glUniform4fv(vShaderDiffuseProduct, 1, diff); 
vec4 spec = vec4(0.80f,0.80f,0.80f,1.0f); 
glUniform4fv(vShaderSpecularProduct, 1, spec); 
float shin = 6.0f; 
glUniform1f(vShaderShininess,shin); 


glClearColor(.2, .2, .2, 1); /* Grey background */ 
} 

私は多分光、アンビエント、鏡面反射、および拡散プロパティを変更する必要がありますか?私は問題が何であるか分かりません。

+0

mCubesとは何ですか(どのようなメソッドから返されますか)。 –

+0

mCubesは、C++クラスの大きなパズルのもう一つの部分です。私はあなたにそれらのすべてを示すことはできませんが、mCubesへの呼び出しはかなり自明です。三角形の頂点の配列、頂点の配列のサイズ、三角形(要素)の数、または法線ベクトル配列を返します。 – user1144605

+0

コードを更新して、すでに見つかった修正を含めることができますか?これにより、実際の問題に簡単に従うことができます。 – rotoglup

答えて

0

あなたが頂点シェーダにあなたが

attribute vec3 vNormal; 

このミスマッチとしてそれを宣言するのに対し、これは、通常のはのコンポーネントを持っていることを示し、次のコード

glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset)); 

を使用してvNormal属性データを渡します法線が誤解されている場合は、問題に関連している可能性があります。

+0

皮肉なことに、私がこの問題を正しければ、私はこれを手に入れます:http://i.stack.imgur.com/eyjPv.png 色の不在はどれですか? – user1144605

+0

これを「修正」した方法を詳しく説明できますか?あなたの法線の実際のメモリレイアウトは何ですか?あなたがフラグメントシェーダーで 'vNormal'によって与えられた値を表示しようとしましたか? – rotoglup

+0

"corrected" init()関数を下部に追加しました。人々が一緒に従うことができるように他のものを交換したくなかった。 – user1144605

関連する問題