2010-02-24 19 views
8

Es bien sabido que el uniforme y los atributos son registros en la GPU. Y mi pregunta es ¿qué sucede cuando se enlaza un programa diferente? ¿El estándar garantiza que los uniformes y/o los indicadores de atributos previamente establecidos se volverán a cargar o tendré que volver a cargarlos manualmente en cualquier caso? Quiero crear un sistema de almacenamiento en caché Me parece que los atributos no se vuelven a cargar (¿sí?) Cuando el programa rebota y ¿qué pasa con los uniformes? ¿El controlador GL ES vuelve a cargar sus valores para mí?OpenGL ES 2: Uniformes y atributos

Respuesta

17

No, no es bien conocido que los uniformes y los atributos son registros en la GPU. De hecho, es incorrecto, al menos en una GPU OpenGL ES 2.0 ampliamente implementada.

Un uniforme es cero a menos que se inicialice explícitamente. Los valores uniformes son estados que siguen al objeto del programa. En otras palabras, si se establece un uniforme en un objeto determinado programa, puede depender del valor que se conserva a través de los usos de la mismo objeto de programa, pero no se puede depender de un uniforme en un lugar dado que se conserva a través de múltiples programas objetos. De hecho, una implementación de OpenGL ES que haga esto violaría las especificaciones. Esto no es un comportamiento indefinido.

Los punteros de atributo son contexto-estado global, y PUEDE depender de estos para preservarse entre llamadas al mismo contexto de OpenGL ES. Lo mismo ocurre con los valores de atributos actuales (establecidos a través de las funciones glVertexAttribute *)

+0

Encontré en la especificación de OpenGL ES que "Los uniformes son un estado específico del objeto de programa. Conservan sus valores una vez cargados, y sus valores se restauran cuando un programa objeto se utiliza, siempre que el objeto del programa no se haya vuelto a vincular ". Así que puedo dejarlo sin cambios si su valor sigue siendo el mismo. Acerca de los atributos. Mi experimento dice diferente: si salteo glVertxAttribPointer cuando el puntero y el búfer son los mismos, visualmente recibo algo incorrecto o incluso una pantalla negra. Pero glGetError todavía está bien. – demi

+0

La parte sobre los uniformes es básicamente lo que dije. Acerca de los atributos, ¿está seguro de que los atributos que intenta volver a utilizar tienen las mismas ubicaciones de atributo? De lo contrario, podría intentar usar glBindAttribLocation antes de vincular el programa para asegurarse. – kusma

+0

Ojalá pudiera hacer +1 dos veces. uno para la respuesta correcta, 1 para el tidbit "registros". ¿De qué GPU sabe que eso no funciona, por cierto? – Bahbar

Cuestiones relacionadas