2016-03-23 8 views
0

Bir GLSL parça gölgelendirici aşağıdaki kodu varsa: o derleyici bu trigonometrik fonksiyonlar değerlendirecek yerine onları her parçası yürütme değerlendirilecek olması aklı başında bir varsayımGLSL: derleyici işlevleri sürekli argümanlar ile değerlendirecek mi?

float r = 0.386; 
float a = 26.6; 
float xd = r*cos(0.0174532924*(a+0)); 
float yd = r*sin(0.0174532924*(a+0)); 
float xe = r*cos(0.0174532924*(a+90)); 
float ye = r*sin(0.0174532924*(a+90)); 

mı?

+0

optimizasyon seviyesi ve derleyici bağlıdır, ancak montaj bakarak çalıştı vermedi ? – Vladp

+1

sadece bir kere hesaplanmaya ihtiyaç duyuyorsanız, neden onları hesaplamıyor ve tek tip bir değişkene veya UBO'ya göndermiyorsunuz? – WearyWanderer

+0

Aslında hesap makinemle hesaplayabilirim ve doğrudan xd, yd, xe, siz bu değerleri atardım - ancak derleyiciye güvenebiliyorsam, kodlamayı kendim belgeleme amacıyla bu durumda bırakmak isterim. – user1282931

cevap

0

Bu durumda, derleme, GPU tarafından yapıldığı için çok fazla bilemezsiniz. Uygulamaya bağlı olduğunu söyleyebilirim, çünkü bazı derleyiciler daha iyi optimize edilmiş olabilir. Bununla birlikte, WearyWanderer'ın dediği gibi, değerleri kodlayabilir veya üniforma/UBO aracılığıyla iletebilirsiniz.

0

Belirtdiğiniz gibi değerleri hesaplayabilir ve bunları doğrudan atayabilir, ancak belgeleme amacıyla izin vermek istiyorsanız, değerlerin shader kodunun her uygulamasında aynı olacağını varsayardım.

Tekdüzen Değişkenler, bir defada tek tip değişkeni değiştirmediğiniz sürece, bir kez hesaplayabileceğiniz, bir gölgelendiriciye gönderebileceğiniz ve her yürütme için aynı olan değişkenlerdir. Örneğin:

float r = 0.386; 
    float a = 26.6; 

    float xd_val = r*cos(0.0174532924*(a+0)); 
    GLuint xd_id = glGetUniformLocation(pShaderProgram, "xd"); 
    glUniform1f(xd_id, xd_val); 

Bu hala, CPU üzerindeki sadece bir kez değeri hesaplar muntazam bir değişken olarak gölgelendirici programına iletir, ve gölgelendirici bunu recaulcating olmadan her yürütme değere erişebilir, ama yaprak İstediğiniz belgelerinizi buraya girin.

Üniforma en yaygın nesne geniş değerleri için kullanılır, IE bir alfa-değeri, phong Shader model için sahne ışıkları geçtikten vb