OpenGL 3およびRadeon HD 4850x2
質問
しばらく前に、私はOpenGL Superbible Fifth Editionのコピーを手に取り、ゆっくりと痛みを伴い、School Wayから1.0 Wayに慣れた後、3.3の方法でOpenGLを教え始めました。物事をより挑戦的にして、私は主に.NET開発者なので、Opentk OpenGLラッパーと一緒にモノで働いていました。私のラップトップで、私はユーザーが、verter-vertexの色と照明とテクスチャマッピングを実装するいくつかのシェーダーを使用して、ユーザーがシンプルな風景を歩き回ることができるプログラムをまとめました。デスクトップで同じプログラムを実行するまで、すべてが見事に機能していました。
災害!何もレンダリングしません!カメラが原点の近くにあるところまで、プログラムを切り刻みました。 で 起源、および正方形をレンダリングします(技術的には、三角ファン)。クワッドは私のラップトップ、着色、照明、テクスチャリングなどを完全にレンダリングしますが、デスクトップは、ライトの影響を受けず、テクスチャーされていない、誤って色付けされた、誤って着色された小さな歪んだ非二乗四辺形をレンダリングします。
Ubuntu 10.10で起動するかXPに獲得しているかどうかにかかわらず、グラフィックカードに障害があると思われます。頂点のシェーダーをパレートして、位置データとフラグメントシェーダーを出力して、クワッドが正しくレンダリングする固体(白)のみを出力するようにしか出力しないことがわかりました。しかし、カラーデータを渡すとすぐに(フラグメントシェーダーで使用するかどうかにかかわらず)、頂点シェーダーからの出力が再び歪んでいます。シェーダーが続きます。既存のコードを残しましたが、コメントして、私が何をしようとしているのかアイデアを得ることができます。私はGLSLのNOOBなので、おそらくコードの方がはるかに優れている可能性があります。
私のラップトップは、Centrino(Core 2)DuoとNvidia Quadroグラフィックスカードを搭載した古いLenovo T61pです。 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を服用するように変更しました。
解決
Nvidiaドライバーは、HEシェーダーにリストされている順序でインプットを残し、AMDドライバーはアルファベット順にソートすることがわかりました。場所を取得するには、getattriblocationを使用する必要がありました。