2011-11-11 20 views
57

OpenGL'in ışıklarından çıkıp kendiminkini yapmak istiyorum. Gölgelerimin değişken bir ışık sayısına izin vermesini istiyorum.GLSL/C++: Üniforma Dizileri?

GLSL gölgelendiricilerde bir dizi üniforma ilan edebilir miyiz? Eğer öyleyse, bu üniformaların değerlerini nasıl ayarlayabilirdik?

+4

Değişken sayıda ışık isteyen herkes, yalnızca yeterli kapasiteye sahip diziler yapar ve şu anda kaç ışığın aktif olduğunu bir sayı olarak tutar. GLSL değişken boyutlu dizilere izin vermez (tüm dizi boyutları sabit, sabit kodlanmış değerler olmalıdır). – Miles

cevap

71

Evet, bu mümkün. C'de nasıl yaptığınıza benzer üniforma dizileri bildirirsiniz.

uniform float v[10]; 

Sonra GLSL shader içinde üniforma bir diziyi bildirmek için glUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...}; 
glUniform1fv(glGetUniformLocation(program, "v"), 10, v); 
+2

1, 2, 3, 4 ne anlama gelir? Bu, bir dizinin değerlerini yalnızca dört üyeye kadar ayarlayabileceğim anlamına mı geliyor? – Miles

+0

Bu, "glUniform1fv" nin çok akıllı/çarpık bir kullanımıdır. Biri, glUniform1fv'nin ikinci parametresinin sadece bir formalite olduğunu ve her zaman 1 olarak kullanılması gerektiğini düşünür. – bobobobo

+0

Teknik olarak, "glUniform1fv (uniformId, 4, v); 'v' 4 yüzerlik bir dizidir. – bobobobo

7

Evet bu mümkün kullanarak değerlerini ayarlayabilirsiniz. Bazı örnekler için sadece google "glsl uniform dizi" (edit: veya datenwolf örneğini görün). Bununla birlikte, farklı ekran kartlarına kaç tane üniformanın gönderilebileceğine dair sınırlamalar var (en azından eski modellerde, güncel olanlardan emin değilim) (yine de orada olacağını düşünmeme rağmen).

Üniforma yoluna gitmeye karar verirseniz, üniforma tamponları kullanmanızı öneririm. http://www.opengl.org/wiki/Uniform_Buffer_Object'a göre, "Tekdüze tampon bağlamaları arasında geçiş yapmak genellikle bir programda düzinelerce üniformanın değiştirilmesinden daha hızlıdır".

Çok sayıda ışık ve parametreniz varsa, verileri float tamponları olarak da gönderebilirsiniz.

+6

Tek tip tampon nesneler sadece GL sürüm 3.1'den beri kullanılabilir. Sürüm 2.0'dan itibaren ARB_Uniform_Buffer_Object uzantısı gereklidir. –

+54

Googling "glsl uniform array" şimdi bu sayfayı ilk sonuç olarak döndürüyor !! Şimdi ne yapacağız? – mlvljr

+1

OpenGL'yi çalışma zamanında sorgulayabilir ve 'Glint sonucu ile maksimum sayıda üniforma elde edebilirsiniz; glGetIntegerv (GL_MAX_UNIFORM_LOCATIONS, 0, & sonuç); – rwols