前一段時間,我拿起了OpenGL OpenGL超級第五版的副本,並慢慢地,痛苦地開始教自己的OpenGL 3.3的方式,在已經被使用到1.0的方式從學校回來的路上時, 。讓事情變得更具挑戰性,我主要是一個.NET開發人員,所以我正在使用OpenTK OpenGL封裝器在Mono中工作。在我的筆記本電腦上,我編寫了一個程序,讓用戶使用實現每頂點着色和照明和紋理貼圖的幾個着色器在簡單的景觀中漫步。一切都很出色,直到我在桌面上運行相同的程序。的OpenGL 3和的Radeon HD 4850x2
災難!沒有什麼會呈現!我把我的程序切碎到相機坐在原點附近的地方,指向在的原點,並呈現一個正方形(技術上說,一個三角扇)。這款四合一筆記本可以完美呈現在我的筆記本電腦上,着色,照明,紋理等等,但是桌面呈現的是一個扭曲的非正方形四邊形,顏色不正確,不受燈光影響,也不具有紋理。
我懷疑顯卡有過錯,因爲我得到了相同的結果我是否啓動到Ubuntu的10.10或Win XP。我確實發現,如果我將頂點着色器削減爲只輸出位置數據和片段着色器以僅輸出純色(白色),則四邊形可以正確渲染。但是當我開始傳遞顏色數據時(不管我是否在片段着色器中使用它),來自頂點着色器的輸出再次失真。着色器跟隨。我離開了原有的代碼,但註釋掉了,所以你可以瞭解我正在嘗試做什麼。我是glsl的noob,所以代碼可能會好很多。
我的筆記本電腦是一箇舊的聯想T61p與迅馳(酷睿2)二重奏和nVidia Quadro顯卡運行Ubuntu 10.10 我的桌面上有一個Radeon HD 4850 x2(單卡,雙GPU)從Saphire雙啓動到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);
}";
請注意,在此代碼中,顏色數據被接受但實際上未使用。無論片段着色器是否使用varyColor,幾何輸出都是相同的(錯誤的)。只有當我註釋掉線條varyingColor = in_color;
才能正確輸出幾何圖形。最初着色器接受vec3輸入,我只修改它們以在故障排除時採用vec4s。