Pregunta

Hace un tiempo, me recogió una copia de la quinta edición de OpenGL y SuperBible lenta y dolorosamente comenzó a enseñar a mí mismo desarrollo OpenGL 3.3 el camino, después de haber sido utilizado para el camino de vuelta desde 1,0 manera la escuela cuando. Hacer las cosas más difíciles, soy principalmente un desarrollador .NET, así que estaba trabajando en Mono con la envoltura OpenTK OpenGL. En mi portátil, que arme un programa que permita que el pie del usuario alrededor de un paisaje simple usando un par de shaders que implementó por vértice coloración y la iluminación y el mapeado de texturas. Todo estaba funcionando brillantemente hasta que me encontré con el mismo programa en el escritorio.

Desastres! Nada haría! He cortado mi programa hasta el punto en el que la cámara se sienta cerca del origen, señalando a el origen, y hace un cuadrado (técnicamente, un ventilador triángulo). El quad hace perfectamente en mi portátil, la coloración, la iluminación, la texturización y todo, pero el escritorio hace un pequeño cuadrilátero no cuadrada distorsionada que se colorea de forma incorrecta, no se ve afectado por las luces, y no con textura.

sospecho que la tarjeta gráfica tiene la culpa, porque me sale el mismo resultado si estoy arrancado en Ubuntu 10.10 o Win XP. He encontrado que si Pare el shader vértice hacia abajo para dar salida a solamente los datos de posición y el shader fragmento a la salida SOLAMENTE un color sólido (blanco) la quad hace correctamente. Pero tan pronto como comienza a pasar en los datos de color (ya sea o no lo uso en el fragment shader) la salida del vertex shader está distorsionada de nuevo. Los shaders siguen. Dejé el código preexistente, pero como comentario para que pueda obtener una idea de lo que estaba tratando de hacer. Soy un novato en GLSL lo que el código probablemente podría ser mucho mejor.

Mi portátil es un viejo Lenovo T61p con un Centrino (Core 2) Duo y una tarjeta gráfica nVidia Quadro con Ubuntu 10.10 Mi escritorio tiene un i7 con una Radeon HD 4850 x2 (tarjeta única, doble GPU) de Saphire doble arranque en Ubuntu 10.10 y Windows XP. El problema se produce tanto en XP y Ubuntu.

Puede alguien ver algo malo que me falta? ¿Qué es "especial" sobre mi 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);
}";

Tenga en cuenta que en este código los datos de color se acepta pero no se utiliza realmente. La geometría se da salida a la misma (mal) si el shader fragmento utiliza varyingColor o no. Sólo si comento hacia fuera de la línea de varyingColor = in_color; hace la salida de la geometría correcta. Originalmente los shaders tomaron en vec3 entradas, lo único que les modificado para tener vec4s mientras que la resolución de problemas.

¿Fue útil?

Solución

Resulta drivers de nVidia dejan entradas en el orden en que se enumeran en él shaders, mientras que los conductores AMD ordenarlos alfabéticamente. Debería haber usado GetAttribLocation para obtener las ubicaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top