OpenGL 3 и Radeon HD 4850x2
Вопрос
Некоторое время назад я взял копию супербибного пятого издания Opengl и медленно и мучительно начал обучать себя opengl 3,3 способа, после того, как он использовался в 1,0 способ от школы назад, когда. Делая вещи более сложными, я в первую очередь разработчик .NET, поэтому я работал в Mono с Opentk OpenGlber. На моем ноутбуке я собрал программу, которая позволяет пользователю ходить по простому ландшафту, используя пару шейдеров, которые реализовали раскраски для переносчика, а также отображение освещения и текстур. Все работало блестяще, пока я не запустил ту же программу на своем рабочем столе.
Стихийное бедствие! Ничто не сделает! Я нарезал свою программу до точки, где камера сидит возле происхождения, указывая в Происхождение и делает квадрат (технически, фанат треугольника). Квадрат идеально подходит на моем ноутбуке, раскраске, освещении, текстуре и все такое, но настольный компьютер делает небольшую искаженную квадратную четырехугольника, которая неверно окрашена, не влияет на свет, а не текстурирован.
Я подозреваю, что видеокарта виновата, потому что я получаю тот же результат, загружен ли я в Ubuntu 10.10 или Win XP. Я обнаружил, что, если я приведу вершин -шейдер вниз только до вывода позиционных данных и фрагментного шейдера только для вывода сплошного цвета (белого), квадратный щит правильно воспроизводит. Но как только я начну передавать цветные данные (независимо от того, использую ли я их в фрагментной шейдере), выход из шейдера вершины снова искажен. Шейдеры следуют. Я оставил ранее существовавший код, но прокомментировал, чтобы вы могли получить представление о том, что я пытался сделать. Я нуб в GLSL, поэтому код, вероятно, может быть намного лучше.
Мой ноутбук - старый Lenovo T61P с дуэтом Centrino (Core 2) и графической картой nvidia Quadro, управляющей Ubuntu 10.10. У моего рабочего стола есть i7 с Radeon HD 4850 x2 (однократная карта, двойная графический процессор) от Dual Booting Saphire в Ubuntu 10.10 и (одиночная карта, Dual GPU) от Dual Booting в 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, я только изменил их, чтобы взять VEC4s при устранении неполадок.
Решение
Оказывается, драйверы nvidia оставляют входные данные в том порядке, в котором они указаны в He Shaders, в то время как драйверы AMD сортируют их в алфавитном порядке. Я должен был использовать getattriblocation, чтобы получить местоположение.