मेरे पास एक रेंडरर 2 डी है जो बहुत ही बुनियादी है लेकिन मेरे मूल 2 डी क्वाड को सही ढंग से प्रस्तुत नहीं करता है। यह इसे विंडो के नीचे बाईं ओर एकल पिक्सेल के रूप में प्रस्तुत करता है। खिड़की का आकार 800x600 . है

ऑर्थोग्राफिक प्रोजेक्शन मैट्रिसेस की गणना glm::ortho(0.0f, 800.0f, 0.0f, 600.0f) का उपयोग करके की जाती है। किसी कारण से यह केवल एक पिक्सेल को गलत स्थान पर प्रस्तुत करता है। और इसे और भी अजीब बनाने के लिए, अगर मैं स्क्रीन के बीच में अनुवाद करने के लिए Model मैट्रिक्स सेट करता हूं, तो यह स्क्रीन के बीच में उस अकेला पिक्सेल को प्रस्तुत करता है

मैं इसे अपने रेंडरर क्लास में इस तरह कहता हूं:

m_Renderer2D.RenderQuad(glm::vec3(400.0f, 300.0f, 1.0f), &m_CrosshairTexture, &m_Camera2D);

रेंडरर वर्ग:

    class Renderer2D    
    {
        public:
    
            Renderer2D();
        
            void RenderQuad(const glm::vec2& position, GLClasses::Texture* texture, OrthographicCamera* camera);
    
        private : 
    
            GLClasses::VertexBuffer m_VBO;
            GLClasses::VertexArray m_VAO;
            GLClasses::IndexBuffer m_IBO;
            GLClasses::Shader m_DefaultShader;
    };
    
cpp file : 

    Renderer2D::Renderer2D() : m_VBO(GL_ARRAY_BUFFER)
    {
        GLuint index_buffer[6] = { 0,1,2,2,3,0 };

        m_VAO.Bind();
        m_VBO.Bind();
        m_IBO.Bind();
        m_VBO.VertexAttribPointer(0, 3, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)0);
        m_VBO.VertexAttribPointer(0, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
        m_IBO.BufferData(6 * sizeof(GLuint), index_buffer, GL_STATIC_DRAW);
        m_VAO.Unbind();

        m_DefaultShader.CreateShaderProgramFromFile("Shaders/2DElementShaderVert.glsl", "Shaders/2DElementShaderFrag.glsl");
        m_DefaultShader.CompileShaders();
    }

    void Renderer2D::RenderQuad(const glm::vec2& position, GLClasses::Texture* texture, OrthographicCamera* camera)
    {
        glDisable(GL_DEPTH_TEST);

        const std::array<GLfloat, 8> texture_coords = texture->GetTextureCoords();

        float x, y, w, h;

        x = position.x;
        y = position.y;
        w = position.x + texture->GetWidth(); // The width and height of the texture is correct
        h = position.y + texture->GetHeight();

    GLfloat Vertices[] = {
        w, y, 0.0f, texture_coords[0], texture_coords[1],
        w, h, 0.0f, texture_coords[2], texture_coords[3],
        x, h, 0.0f, texture_coords[4], texture_coords[5],
        x, y, 0.0f, texture_coords[6], texture_coords[7],
    };

        m_DefaultShader.Use();

        glm::mat4 proj = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f);

        texture->Bind(1);
        m_DefaultShader.SetMatrix4("u_Projection", proj, 0);
        m_DefaultShader.SetMatrix4("u_View", camera->GetViewMatrix(), 0);
        m_DefaultShader.SetMatrix4("u_Model", glm::mat4(1.0f), 0);
        m_DefaultShader.SetInteger("u_Texture", 1, 0);
        
        // Draw the 2D quad 
        m_VAO.Bind();
        m_VBO.BufferData(20 * sizeof(GLfloat), Vertices, GL_STATIC_DRAW);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0);
        m_VAO.Unbind();

        glEnable(GL_DEPTH_TEST);
    }

शेडर्स:

वर्टेक्स शेडर:

#version 330 core

layout(location = 0) in vec3 a_Position;
layout(location = 1) in vec2 a_TexCoord;

out vec2 v_TexCoord;

uniform mat4 u_Projection;
uniform mat4 u_View;
uniform mat4 u_Model;

void main()
{
    gl_Position = u_Projection * u_View * u_Model * vec4(a_Position, 1.0f);
    v_TexCoord = a_TexCoord;
}

फ्रैगमेंट शेडर:

#version 330 core

in vec2 v_TexCoord;
out vec4 o_Color;

uniform sampler2D u_Texture;

void main()
{
    o_Color = texture(u_Texture, v_TexCoord);
}
1
rassheir platey 7 जुलाई 2020, 15:21

1 उत्तर

सबसे बढ़िया उत्तर

लेआउट स्थान शीर्ष निर्देशांक को इंडेक्स 0 की विशेषता से जोड़ते हैं और बनावट इंडेक्स 1 को विशेषता देने के लिए निर्देशांक करते हैं:

layout(location = 0) in vec3 a_Position;
layout(location = 1) in vec2 a_TexCoord;

जब आप जेनेरिक वर्टेक्स एट्रिब्यूट डेटा की सरणियों को निर्दिष्ट करते हैं, तो वर्टेक्स एट्रीब्यूट ऐरे 0 को दो बार निर्दिष्ट किया जाता है, लेकिन आप वर्टेक्स एट्रिब्यूट ऐरे 1 को निर्दिष्ट करने से चूक गए:

m_VBO.VertexAttribPointer(0, 3, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)0);
m_VBO.VertexAttribPointer(0, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));

इसलिए बनावट निर्देशांक शीर्ष निर्देशांक को कवर करते हैं और बनावट समन्वय विशेषता बिल्कुल निर्दिष्ट नहीं है।

बनावट निर्देशांक के लिए विशेषता सूचकांक 0 के बजाय 1 होना चाहिए:

m_VBO.VertexAttribPointer(0, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));

m_VBO.VertexAttribPointer(1, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat))); 
3
Rabbid76 7 जुलाई 2020, 14:52