Pinsirus
Založen: 13. 01. 2016 Příspěvky: 37 Bydliště: Slovensko
|
Zaslal: 23. září 2016, 16:48:27 Předmět: OpenGL instanced rendering |
|
|
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);
} |
|
|
Pinsirus
Založen: 13. 01. 2016 Příspěvky: 37 Bydliště: Slovensko
|
Zaslal: 24. září 2016, 19:24:34 Předmět: |
|
|
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 |
|