2009-11-24 23 views
12

He estado ajustando el procesador de mi juego para mi portátil, que tiene una Radeon HD 3850. Este chip tiene una cantidad decente de potencia de procesamiento, pero bastante limitado de ancho de banda, así que he intentado mover más sombreador trabajar en menos pases.Limitaciones de Shader

Anteriormente, yo estaba usando un modelo simple de multipaso:

  • Enlazar y tampón mezcla FP16 claro (con tampón de profundidad)
    • Profundidad de sólo pase
    • para cada luz, hacer un aditivo pase la luz backbuffer
  • Bind, tampón utilización mezcla como una textura
    • mapeo de tonos pasar

En un intento de mejorar el rendimiento de este método, que ha escrito una nueva vía de representación que cuenta el número y el tipo de luces para construir dinámicamente shaders GLSL personalizados. Estos sombreadores aceptan todos los parámetros de luz como uniformes y hacen toda la iluminación en una sola pasada. Esperaba encontrar algún tipo de límite, así que lo probé primero con una luz. Luego tres. Luego, veintiuno, sin errores ni artefactos, y con un gran rendimiento. Esto me lleva a mis preguntas reales:

¿Se puede recuperar el número máximo de uniformes?

¿Es este método viable en hardware antiguo, o los uniformes son mucho más limitados?

Si lo presiono demasiado, ¿en qué punto obtendré un error? Compilación Shader? Enlace de programa? Usando el programa?

Respuesta

11

Los uniformes de sombreado se implementan normalmente por el hardware como registros (o a veces parcheando los valores en el microcódigo de sombreado directamente, por ejemplo, sombreadores de fragmentos nVidia). El límite es, por lo tanto, altamente dependiente de la implementación.

Puede recuperar los máximos consultando GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB y GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB para sombreados de vértices y fragmentos, respectivamente.

+6

Tenga en cuenta que para GL2.0 está garantizado que tiene al menos 512 uniformes de vértices y 64 uniformes de fragmentos. –

+1

Oh, falla en RTFM de mi parte. Más preguntas vienen a la mente: ¿Cada uno de los flotadores y motores consume un componente? ¿Hay alguna restricción en el embalaje? ¿Cuatro carrozas contra un vec4? Un flotador y un vec3? – mvanbem

+2

@mvanbem: Un uniforme ocupa al menos un vector 4D. Por lo tanto, si está muy ajustado al almacenamiento uniforme, considere empacar múltiples escalares en un solo vector 4D. –

-5

Supongo que la cantidad máxima de uniformes está determinada por la cantidad de memoria de video, , ya que es solo una variable. Los varaibles normales en la CPU están limitados por tu RAM también, ¿verdad?

+1

Los uniformes tienen un límite estricto establecido por el hardware. El hardware moderno tiene límites muy altos, pero aún existen. El hardware antiguo (más de 2 años) puede tener límites mucho más bajos. –

3

Ver 4.3.5 Uniforme de El OpenGL Shading Language specs:

Hay un límite depende de la implementación de la cantidad de almacenamiento para los uniformes que se puede utilizar para cada tipo de shader y si esto se excede, causará un error de tiempo de compilación o tiempo de enlace. Uniform Las variables que se declaran pero no se usan no cuentan contra este límite.

Fallará en el enlace o en tiempo de compilación, pero no se utilizará el programa.

2

Para saber cómo obtener el número máximo admitido por su implementación de OpenGL, vea la respuesta de moonshadow.

Para tener una idea de dónde está realmente el límite para las GPU arbitrarias, recomiendo ver qué versión DX es compatible con la GPU.

DX9 nivel de hardware:

  • vs2_0 soporta 256 vec4. ps2_0 es compatible con 32 vec4.
  • vs3_0 es 256 vec4, ps3_0 es 224 vec4.

nivel de hardware DX10:

vs4_0/ps4_0 es una estancia mínima de 4096 por las constantes búfer constante - y se puede tener 16 de ellos.

En resumen, es poco probable que se quede sin algo basado en DX10.