.[ ČeskéHry.cz ].
OpenGL instanced rendering

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Pinsirus



Založen: 13. 01. 2016
Příspěvky: 37
Bydliště: Slovensko

PříspěvekZaslal: 23. září 2016, 16:48:27    Předmět: OpenGL instanced rendering Odpovědět s citátem

Zdravim, snažim sa implementovat instanced rendering a chcel by som sa spytat na par veci :

1. V tutorialoch použivaju nejaku formu offsetov - je to naozaj potrebne? nestačia mi proste pozicie mojich vertexov aby som vedel, kde ich vykreslit?

2. Da sa to implementovat aj pri použivani 1 VBO a VAO?

3. Sa tyka mojho pokusu o implementaciu, preto sem postnem aj jednotlive kusky kodov. Pokial sa pokusim o render, nevykresli sa nič.
Ak však nepoužijem glVertexAttribDivisor(x,y) tak to vyrenderuje dany objekt, ale n-krat na tom istom mieste


Tvorba VAO a VBO
kód:
    void TextManager::createVAO(){
        if (_vaoID==0) glGenVertexArrays(1,&_vaoID);
        glBindVertexArray(_vaoID);

        if (_vboID==0) glGenBuffers(1,&_vboID);
        glBindBuffer(GL_ARRAY_BUFFER,_vboID);


        //This is the position
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)offsetof(Vertex,position));
        glVertexAttribDivisor(0,1);


        //Color attrib pointer
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(1,4,GL_UNSIGNED_BYTE,GL_TRUE,sizeof(Vertex),(void*)offsetof(Vertex,color));
        glVertexAttribDivisor(1,1);

        //UV
        glEnableVertexAttribArray(2);
        glVertexAttribPointer(2,2,GL_FLOAT,GL_TRUE,sizeof(Vertex),(void*)offsetof(Vertex,uv));
        glVertexAttribDivisor(2,1);


        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER,0);
    }

    void TextManager::loadVBO(){
        glBindBuffer(GL_ARRAY_BUFFER,_vboID);

        //Buffering the data
        glBufferData(GL_ARRAY_BUFFER,_vboDATA.size()*sizeof(vboInfo)*sizeof(Vertex),nullptr,GL_DYNAMIC_DRAW);
        glBufferSubData(GL_ARRAY_BUFFER,0,_vboDATA.size()*sizeof(vboInfo)*sizeof(Vertex),_vboDATA.data());

        glBindBuffer(GL_ARRAY_BUFFER,0);


    }


Render funkcia
kód:
    void TextManager::renderText(){
        //Binding VAO
        glBindVertexArray(_vaoID);

        //Binding the texture
        glBindTexture(GL_TEXTURE_2D,EHM[0]->textSprite->getTexture());

        //Using instancing to render objects
        glDrawArraysInstanced(GL_TRIANGLES,0,6,_vboDATA.size());

        glBindVertexArray(0);
    }


Fragment shader
kód:
#version 330


in vec4 fragmentColor;
in vec2 fragmentUV;

out vec4 color;

uniform sampler2D Sampleris;

void main(){
   vec4 textureColor=  texture(Sampleris, fragmentUV);

   color = textureColor ;
}


Vertex shader
kód:
#version 330

in vec2 vertexPosition;
in vec4 vertexColor;
in vec2 vertexUV;

out vec4 fragmentColor;
out vec2 fragmentUV;

uniform mat4 P;

void main(){
   gl_Position.xy = (P * vec4(vertexPosition ,0.0, 1.0)).xy;
   gl_Position.z = 0.0;
   gl_Position.w = 1.0;   

   fragmentColor = vertexColor;
   fragmentUV = vec2(vertexUV.x, 1.0-vertexUV.y);
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 23. září 2016, 22:06:37    Předmět: Odpovědět s citátem

co ti chyba je spravit z P pole aby si donho mohol indexovat pomocou gl_InstanceID. neviem preco pouzivas glVertexAttribDivisor() pretoze 0 co je vychodzia hodnota a 1 co nastavujes by malo mat rovnaky efekt.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Pinsirus



Založen: 13. 01. 2016
Příspěvky: 37
Bydliště: Slovensko

PříspěvekZaslal: 24. září 2016, 19:24:34    Předmět: Odpovědět s citátem

maš na mysli pole matic? a nastavovat pozicie asi takto?

kód:
uniform mat4 P[100];

gl_Position.xy = (P[gl_InstanceID] * vec4(vertexPosition ,0.0, 1.0)).xy;


ak nie tak som asi trochu mimo(napriklad čo ak budem potom renderovat bez instancingu? mam si urobit 2 shadery?)a mimo to, nebude robit problem limit uniform premennych(povedzme 1000+ objektov)? popravde som dufal, že nebude potreba zasahovat do shaderu a chcel som vyskušat instancing pomocou array attribs, preto som tam použil funkciu glVertexAttribDivisor
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 25. září 2016, 09:54:58    Předmět: Odpovědět s citátem

ano tak. to co opisujes je druhy sposob ako robit instanced rendering. obydva sposoby su opisane tu http://learnopengl.com/#!Advanced-OpenGL/Instancing
chyba ti este jeden vertex attribute v ktorom budes mat pre kazdu instaciu specificke data.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Pinsirus



Založen: 13. 01. 2016
Příspěvky: 37
Bydliště: Slovensko

PříspěvekZaslal: 25. září 2016, 15:33:19    Předmět: Odpovědět s citátem

už to funguje Smile mal si pravdu neuvedomil som si že potrebujem ešte jeden vertex attrib.. diky moc
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna