Pregunta

Tengo muchas posiciones e instrucciones almacenadas en texturas 1D en la GPU. Quiero usarlos como RenderSources en un sombreador de geometría GLSL. Para hacer esto, necesito crear matrices de vista correspondientes a partir de esas texturas.

Mi primer pensamiento es tomar un desvío a la CPU, leer las texturas a la memoria y crear un montón de matrices de vista desde allí, con algo como glm::lookat(). Luego envíe las matrices como variables uniformes al sombreador.

Mi pregunta es, ¿por qué es posible omitir este desvío y, en su lugar, crear las matrices de vista directamente en el sombreador de geometría GLSL? Además, ¿es este rendimiento factible?

¿Fue útil?

Solución

Nadie dice (o nadie debería decir) que tu visión Matrix tiene que provenir de la CPU a través de un uniforme. Puede generar la matriz View desde los vectores en su textura justo dentro del sombreador. Tal vez la implementación del buen viejo glulookat es de ayuda para ti allí.

Si este enfoque es una buena idea, en cuanto al rendimiento, es otra pregunta, pero si esta textura es bastante grande o cambia con frecuencia, este abril podría ser mejor que leerla a la CPU.

Pero tal vez pueda precenerar las matrices en otra textura/búfer utilizando un sombreador simple similar a GPGPU que no hace nada más que generar una matriz para cada posición/vector en las texturas y almacenar esto en otra textura (usando FBO) o búfer ( usando la retroalimentación de transformación). De esta manera, no necesita hacer un viaje redondo en la CPU y no necesita generar las matrices de nuevo para cada vértice/primitivo/lo que sea. Por otro lado, esto aumentará la memoria requerida ya que una matriz 4x4 es un poco más pesada que una posición y una dirección.

Otros consejos

Por supuesto. Lea la textura y construya las matrices a partir de los valores ...

vec4 x = texture(YourSampler, WhateverCoords1);
vec4 y = texture(YourSampler, WhateverCoords2);
vec4 z = texture(YourSampler, WhateverCoords3);
vec4 w = texture(YourSampler, WhateverCoords4);
mat4 matrix = mat4(x,y,z,w);

¿Algún problema con esto? ¿O me perdí algo?

La matriz de vista es un uniforme, y los uniformes no cambian en el medio de un lote de renderizado, ni se pueden escribir desde un sombreador (directamente). En la medida en que no veo cómo generarlo podría ser posible, al menos no directamente.

También tenga en cuenta que el sombreador de geometría se ejecuta después de que los vértices se han transformado con la matriz ModelView, por lo que no tiene demasiado sentido (al menos durante el mismo pase) reinterpretar esa matriz o parte de ella.

Por supuesto, probablemente aún podría hacer algunos hack con la retroalimentación de transformación, escribir algunos valores a un búfer, y copiar/vincular esto como un búfer uniforme más tarde o simplemente leer los valores desde un sombreador y multiplicarse como una matriz. Eso al menos evitaría un viaje redondo para la CPU: la pregunta es si tal enfoque tiene sentido y si realmente quiere hacer algo tan oscuro. Es difícil saber qué es lo mejor sin saber exactamente lo que quieres lograr, pero probablemente solo transformar las cosas en el sombreador de vértices (lea esas texturas, construya una matriz, multiplica) funcionará mejor y más fácil.

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