少し前、私はOpenGL SuperBible 5版のコピーを手に入れ、学校の道から1.0の道に慣れた後、ゆっくりと痛いほどOpenGLを3.3の方法で教え始めました。 。私は主に.NET開発者ですから、OpenTK OpenGLラッパーを使ってMonoで作業していました。私のラップトップでは、頂点ごとの色付けとライティングとテクスチャマッピングを実装した2つのシェーダを使用して、ユーザーが簡単な風景を歩き回るようにするプログラムを作成しました。デスクトップ上で同じプログラムを実行するまで、すべてがうまくいっていました。OpenGL 3とRadeon HD 4850x2
災害!何もレンダリングされません!私はカメラが原点の近くにあり、をにして、正方形(技術的には三角形のファン)をレンダリングする点まで、プログラムを切り下げました。クワッドは私のラップトップ、カラーリング、ライティング、テクスチャリング、そしてすべてで完璧にレンダリングされますが、デスクトップは、光の影響を受けず、テクスチャリングされていない小さな歪んだ非正方形の四辺形をレンダリングします。
私はUbuntu 10.10またはWin XPを起動しても同じ結果を得るため、グラフィックカードに問題があると思われます。私は、頂点シェーダを位置データとフラグメントシェーダのみを単色(白)に出力するようにペアーすると、クワッドが正しく描画されることが分かりました。しかし、私が(フラグメントシェーダで使用しているかどうかにかかわらず)カラーデータを渡すようになるとすぐに、頂点シェーダからの出力が再び歪んでしまいます。シェーダが続きます。私は既存のコードを残しましたが、コメントアウトして、私がしようとしていることを知ることができます。私はglslでnoobですので、コードはおそらくもっと良いかもしれません。
私のラップトップは私のデスクトップはサファイアデュアルからのRadeon HD 4850 X2(シングルカード、デュアルGPU)とi7のを持っているのCentrino(コア2)のデュオとUbuntu 10.10 を実行しているのnVidiaのQuadroグラフィックスカードを搭載した古いレノボT61pですUbuntu 10.10とWindows XPで起動します。この問題は、XPとUbuntuの両方で発生します。
誰かが間違っていることが分かりますか?私のHD 4850x2の「特別な」とは何ですか?
string vertexShaderSource = @"
#version 330
precision highp float;
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
//uniform mat4 normal_matrix;
//uniform mat4 cmv_matrix; //Camera modelview. Light sources are transformed by this matrix.
//uniform vec3 ambient_color;
//uniform vec3 diffuse_color;
//uniform vec3 diffuse_direction;
in vec4 in_position;
in vec4 in_color;
//in vec3 in_normal;
//in vec3 in_tex_coords;
out vec4 varyingColor;
//out vec3 varyingTexCoords;
void main(void)
{
//Get surface normal in eye coordinates
//vec4 vEyeNormal = normal_matrix * vec4(in_normal, 0);
//Get vertex position in eye coordinates
//vec4 vPosition4 = modelview_matrix * vec4(in_position, 0);
//vec3 vPosition3 = vPosition4.xyz/vPosition4.w;
//Get vector to light source in eye coordinates
//vec3 lightVecNormalized = normalize(diffuse_direction);
//vec3 vLightDir = normalize((cmv_matrix * vec4(lightVecNormalized, 0)).xyz);
//Dot product gives us diffuse intensity
//float diff = max(0.0, dot(vEyeNormal.xyz, vLightDir.xyz));
//Multiply intensity by diffuse color, force alpha to 1.0
//varyingColor.xyz = in_color * diff * diffuse_color.xyz;
varyingColor = in_color;
//varyingTexCoords = in_tex_coords;
gl_Position = projection_matrix * modelview_matrix * in_position;
}";
string fragmentShaderSource = @"
#version 330
//#extension GL_EXT_gpu_shader4 : enable
precision highp float;
//uniform sampler2DArray colorMap;
//in vec4 varyingColor;
//in vec3 varyingTexCoords;
out vec4 out_frag_color;
void main(void)
{
out_frag_color = vec4(1,1,1,1);
//out_frag_color = varyingColor;
//out_frag_color = vec4(varyingColor, 1) * texture(colorMap, varyingTexCoords.st);
//out_frag_color = vec4(varyingColor, 1) * texture(colorMap, vec3(varyingTexCoords.st, 0));
//out_frag_color = vec4(varyingColor, 1) * texture2DArray(colorMap, varyingTexCoords);
}";
このコードでは、カラーデータは受け入れられますが、実際には使用されません。ジオメトリは、フラグメントシェーダがvaryingColorを使用するかどうかにかかわらず、同じ(間違った)出力されます。私がコメントアウトした場合にのみ、varyingColor = in_color;
はジオメトリ出力を正しく出力します。もともとシェイダーはvec3の入力を受け取りましたが、トラブルシューティング中にvec4を取るように変更しました。