मैं विश्वविद्यालय के लिए केवल कोर ओपनजीएल 3.3 का उपयोग करके वोल्फेंस्टीन 3 डी का क्लोन लिख रहा हूं और मैंने sprites के साथ एक समस्या में भाग लिया है, अर्थात् उन्हें सही ढंग से आधारित करने के लिए दूरी परकैमरे से दूरी पर आधारित प्वाइंट स्प्राइट्स का आकार
जो मैं कह सकता हूं, उससे ओजीएल के पिछले संस्करण वास्तव में आपके लिए ऐसा करेंगे, लेकिन उस कार्यक्षमता को हटा दिया गया है, और इसके सभी प्रयासों को फिर से लागू करने के लिए पूरी विफलता हुई है।
मेरा वर्तमान कार्यान्वयन दूरी पर पारगम्य है, मध्य सीमा पर बहुत शर्मीली नहीं है और नजदीक सीमा पर bizzare है।
मुख्य समस्या (मुझे लगता है) यह है कि मुझे गणित का उपयोग करने की कोई समझ नहीं है।
स्प्राइट का लक्ष्य आकार व्यूपोर्ट से थोड़ा बड़ा है, इसलिए इसे 'तस्वीर से बाहर जाना' चाहिए क्योंकि आप इसे ठीक करते हैं, लेकिन ऐसा नहीं होता है। यह छोटा हो जाता है, और यह मुझे बहुत भ्रमित कर रहा है।
शब्दों के पर्याप्त होने पर, मैंने इसका एक छोटा वीडियो रिकॉर्ड किया। (मेरा सही पर है)
किसी को भी, जहां मैं गलत जा रहा हूँ करने के लिए मुझे प्रत्यक्ष कर सकते हैं, और इसका कारण बताएं?
कोड:
सी ++
// setup
glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
glEnable(GL_PROGRAM_POINT_SIZE);
// Drawing
glUseProgram(StaticsProg);
glBindVertexArray(statixVAO);
glUniformMatrix4fv(uStatixMVP, 1, GL_FALSE, glm::value_ptr(MVP));
glDrawArrays(GL_POINTS, 0, iNumSprites);
शीर्ष shader
#version 330 core
layout(location = 0) in vec2 pos;
layout(location = 1) in int spriteNum_;
flat out int spriteNum;
uniform mat4 MVP;
const float constAtten = 0.9;
const float linearAtten = 0.6;
const float quadAtten = 0.001;
void main() {
spriteNum = spriteNum_;
gl_Position = MVP * vec4(pos.x + 1, pos.y, 0.5, 1); // Note: I have fiddled the MVP so that z is height rather than depth, since this is how I learned my vectors.
float dist = distance(gl_Position, vec4(0,0,0,1));
float attn = constAtten/((1 + linearAtten * dist) * (1 + quadAtten * dist * dist));
gl_PointSize = 768.0 * attn;
}
टुकड़ा shader
#version 330 core
flat in int spriteNum;
out vec4 color;
uniform sampler2DArray Sprites;
void main() {
color = texture(Sprites, vec3(gl_PointCoord.s, gl_PointCoord.t, spriteNum));
if (color.a < 0.2)
discard;
}
आप 'pos.x + 1' का उपयोग क्यों करते हैं? –
मुझे लगता है कि ऐसा इसलिए है क्योंकि उन्होंने स्प्राइट सेंटर की स्थिति को बाएं से नीचे सेट किया है, लेकिन वह वास्तव में शीर्ष केंद्र में एंकर पॉइंट चाहता है। –
मैं अनुलग्नक बिंदु को नीचे किनारे के केंद्र में रखना चाहता हूं, लेकिन संरेखण के मुद्दों के समूह के कारण मुझे सॉर्ट करने के लिए चारों ओर नहीं मिला है, मुझे कुछ चीजों को कुछ हद तक बदलना है। –