0

少し前に、私は OpenGL SuperBible の第 5 版のコピーを手に取り、学校から 1.0 の方法に慣れていた後、ゆっくりと苦痛を伴いながら 3.3 の方法で OpenGL を独学し始めました。さらに難しいことに、私は主に .NET 開発者であるため、OpenTK OpenGL ラッパーを使用して Mono で作業していました。私のラップトップで、頂点ごとのカラーリングとライティング、およびテクスチャ マッピングを実装したいくつかのシェーダーを使用して、ユーザーが単純なランドスケープを歩き回ることができるようにするプログラムをまとめました。デスクトップで同じプログラムを実行するまで、すべてがうまく機能していました。

災害!何もレンダリングされません! カメラが原点の近くに位置し、原点を指し、正方形 (技術的には三角形のファン) をレンダリングするようにプログラムを切り詰めました。四角形は、私のラップトップ、カラーリング、照明、テクスチャリングなどすべてで完全にレンダリングされますが、デスクトップでは、間違って色付けされ、ライトの影響を受けず、テクスチャリングされていない小さな歪んだ非正方形の四角形がレンダリングされます。

Ubuntu 10.10またはWin XPのどちらで起動しても同じ結果が得られるため、グラフィックカードに障害があると思われます。頂点シェーダーを縮小して位置データのみを出力し、フラグメント シェーダーをソリッド カラー (白) のみを出力するようにすると、クワッドが正しくレンダリングされることがわかりました。しかし、(フラグメント シェーダーで使用するかどうかに関係なく) カラー データを渡し始めるとすぐに、頂点シェーダーからの出力が再び歪んでしまいます。シェーダーが続きます。既存のコードは残しましたが、何をしようとしているのかを理解できるようにコメントアウトしました。私は glsl の初心者なので、コードはおそらくもっと良くなるでしょう。

私のラップトップは、Ubuntu 10.10 を実行する Centrino (Core 2) Duo と nVidia Quadro グラフィックス カードを搭載した古い lenovo T61p です。 WindowsXP. この問題は、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);
}";

このコードでは、カラー データは受け入れられますが、実際には使用されないことに注意してください。フラグメント シェーダが VariousColor を使用するかどうかに関係なく、ジオメトリは同じ (間違った) 出力されます。行をコメントアウトした場合にのみvaryingColor = in_color;、ジオメトリが正しく出力されます。元々、シェーダーは vec3 入力を使用していましたが、トラブルシューティング中に vec4 を使用するように変更しただけです。

4

1 に答える 1

1

nVidia ドライバーはシェーダーにリストされている順序で入力を残すのに対し、AMD ドライバーは入力をアルファベット順に並べ替えることがわかりました。GetAttribLocation を使用して場所を取得する必要がありました。

于 2011-01-21T07:16:32.783 に答える