Ifc::batch for static models | << Home >>
batch.frag
varying vec4 pix_clr;
void main() {
gl_FragColor = pix_clr;
}
batch_static.vert
attribute vec3 vtx_pos;
attribute vec3 vtx_nrm;
attribute vec2 vtx_tex;
attribute vec4 vtx_clr;
uniform mat4 prm_viewproj;
varying vec4 pix_clr;
void main() {
pix_clr = vtx_clr;
gl_Position = prm_viewproj * vec4(vtx_pos, 1.0);
}
draw_simple_ogl.cpp
static void batch_impl(cxModelWork* pWk, const int ibat, const Draw::Mode mode, const Draw::Context* pCtx) {
if (mode == Draw::DRWMODE_SHADOW_CAST) return;
if (!pCtx) return;
if (!pWk) return;
sxModelData* pMdl = pWk->mpData;
if (!pMdl) return;
if (!pMdl->ck_batch_id(ibat)) return;
bool skinFlg = pMdl->has_skin();
const sxModelData::Batch* pBat = pMdl->get_batch_ptr(ibat);
if (!pBat) return;
GPUProgram* pProg = nullptr;
GLsizei stride = 0;
if (skinFlg) { /* skip deformable models for now */ } else {
pProg = &s_progStatic;
stride = (GLsizei)sizeof(GPUGeom);
}
if (stride <= 0) return;
if (!pProg) return;
if (!pProg->is_valid()) return;
pProg->use();
/* batch data origin in VB */
size_t vbOrg = pBat->mMinIdx * stride;
/* set geometry buffers and vertex description */
GLuint vbo = GPUModel::get_vertex_buffer(pMdl);
GLuint ibo = GPUModel::get_index_buffer(pMdl);
if (!(vbo > 0 && ibo > 0)) return;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
pProg->enable_vertex_vec3("vtx_pos", stride, vbOrg + offsetof(GPUGeom, pos));
pProg->enable_vertex_vec3("vtx_nrm", stride, vbOrg + offsetof(GPUGeom, nrm));
pProg->enable_vertex_vec2("vtx_tex", stride, vbOrg + offsetof(GPUGeom, tex));
pProg->enable_vertex_vec4("vtx_clr", stride, vbOrg + offsetof(GPUGeom, clr));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
/* set rendering options */
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
/* set parameters */
pProg->set_matrix("prm_viewproj", pCtx->view.mViewProjMtx);
pProg->draw_triangles(pBat->mTriNum, pBat->mIdxOrg);
pProg->disable_vertex_inputs();
}
batch.frag
varying vec4 pix_clr;
void main() {
vec4 c = pix_clr;
c.rgb = max(c.rgb, 0.0);
c.rgb *= 0.7;
c.rgb = sqrt(c.rgb);
gl_FragColor = c;
}
Ifc::batch for static models | << Home >>
|