2013-06-27 11 views
5

में वर्टेक्स विशेषता के रूप में एक मैट्रिक्स का उपयोग करना मैं ओएसएक्स पर ओपनजीएल 3.2 कोर प्रोफाइल का उपयोग कर रहा हूं। और मैं इंस्टेंट ड्रॉइंग (glDrawArraysInstanced) करना चाहता हूं, जहां मैं प्रत्येक इंस्टेंस के लिए मैट्रिक्स पास करता हूं।ओपनजीएल 3 कोर प्रोफाइल

मेरे शिखर शेडर ठीक बनाता है:

#version 150 
in mediump vec4 position; 
in mediump mat4 trf; 
in lowp vec4 rgb; 
out lowp vec4 colour; 
uniform highp mat4 modelcamviewprojmat; 
void main() 
{ 
    mediump vec4 tpos = trf * position; 
    gl_Position = modelcamviewprojmat * tpos; 
    colour = rgb; 
} 

'टीआरएफ' के बंधन ठीक चला गया:

glBindAttribLocation(program, ATTRIB_TRF, "trf"); 

लेकिन मैं अपने डेटा में कैसे पारित कर सकते हैं? glVertexAttribPointer 4 फ्लोट से बड़े मानों को पास नहीं कर सकता है। तो यह कॉल के विफल:

glVertexAttribPointer(ATTRIB_TRF, 16, GL_FLOAT, 0, 16 * sizeof(float), ...); 

मुझे लगता है कि मैं glVertexAttribPointer करने के लिए 4 कॉल, हर बीतते 4 तैरता से बदलने की जरूरत है। लेकिन मैं 'इंडेक्स' (पहला पार्म) के लिए किस मूल्य का उपयोग कर सकता हूं? क्या मुझे इसके बजाय 4 वेक्टर विशेषताओं का उपयोग करने की आवश्यकता है, और जीएलएसएल वर्टेक्स शेडर में चार वैक्टरों को इकट्ठा करना है? यदि हां, तो किस प्रकार का जीएलएसएल कोड इसे पूरा करता है? या क्या मैं BindAttribLocation से रिटर्न वैल्यू का उपयोग कर सकता हूं और सभी पंक्तियों के लिए वैल + 0, वैल + 1, वैल + 2 और वैल + 3 का उपयोग कर सकता हूं?

उत्तर

8

this page के अनुसार और मेरे खेल में हार्डवेयर इंस्टेंसिंग के मेरे वर्तमान कार्यान्वयन के अनुसार, यह सही तरीके से किया गया है कि mat4 विशेषता 4 विशेषता स्थान लेती है। जिसे आप बांधते हैं और 3 निम्नलिखित हैं।

int pos = glGetAttribLocation(shader_instancedarrays.program, "transformmatrix"); 
int pos1 = pos + 0; 
int pos2 = pos + 1; 
int pos3 = pos + 2; 
int pos4 = pos + 3; 
glEnableVertexAttribArray(pos1); 
glEnableVertexAttribArray(pos2); 
glEnableVertexAttribArray(pos3); 
glEnableVertexAttribArray(pos4); 
glBindBuffer(GL_ARRAY_BUFFER, VBO_containing_matrices); 
glVertexAttribPointer(pos1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(0)); 
glVertexAttribPointer(pos2, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 4)); 
glVertexAttribPointer(pos3, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 8)); 
glVertexAttribPointer(pos4, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 12)); 
glVertexAttribDivisor(pos1, 1); 
glVertexAttribDivisor(pos2, 1); 
glVertexAttribDivisor(pos3, 1); 
glVertexAttribDivisor(pos4, 1); 
+0

हाँ, मेरे लिए काम करता है। धन्यवाद। – Bram

+0

मैंने हमेशा यह पता लगाने के लिए देखा कि मेरी समस्या का समाधान केवल glVertexAttribDivisor के लिए गायब कॉल था। आपको बहुत - बहुत धन्यवाद! – ThePadawan

संबंधित मुद्दे