enum piglit_result piglit_display(void) { bool pass = true; float green[] = {0, 1, 0}; glClearColor(.4, .4, .4, 1.); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf); /* use non zero baseinstance value to verify it doesn't affect * gl_InstanceID */ glDrawElementsInstancedBaseInstance(GL_TRIANGLES, ARRAY_SIZE(indices), GL_UNSIGNED_INT, NULL, 1, 15); pass = piglit_probe_rect_rgb(0, 0, piglit_width, piglit_height, green) && pass; pass = piglit_check_gl_error(GL_NO_ERROR) && pass; piglit_present_results(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
inline void drawElementsInstancedBaseInstance( DrawElementsInstancedBaseInstanceMode mode , GLsizei count , DrawElementsInstancedBaseInstanceType type , const void * indices =0, GLsizei primcount =1, GLuint baseinstance =0) { glDrawElementsInstancedBaseInstance( GLenum(mode), GLsizei(count), GLenum(type), indices, primcount, baseinstance ); }
void object::render_sub_object(unsigned int object_index, unsigned int instance_count, unsigned int base_instance) { glBindVertexArray(vao); #if defined (__APPLE__) if (index_buffer != 0) { glDrawElementsInstanced(GL_TRIANGLES, num_indices, index_type, 0, instance_count); } else { glDrawArraysInstanced(GL_TRIANGLES, sub_object[object_index].first, sub_object[object_index].count, instance_count); } #else if (index_buffer != 0) { glDrawElementsInstancedBaseInstance(GL_TRIANGLES, num_indices, index_type, 0, instance_count, base_instance); } else { glDrawArraysInstancedBaseInstance(GL_TRIANGLES, sub_object[object_index].first, sub_object[object_index].count, instance_count, base_instance); } #endif }
// -------------------------------------------------------------------------------------------------------------------- void TexturedQuadsGLTextureArray::Render(const std::vector<Matrix>& _transforms) { // Program Vec3 dir = { 0, 0, 1 }; Vec3 at = { 0, 0, 0 }; Vec3 up = { 0, 1, 0 }; dir = normalize(dir); Vec3 eye = at - 250 * dir; Matrix view = matrix_look_at(eye, at, up); Matrix view_proj = mProj * view; glUseProgram(mProgram); glUniformMatrix4fv(mUniformLocation.ViewProjection, 1, GL_TRUE, &view_proj.x.x); glUniform1iv(mUniformLocation.TexContainer, mTexUnits.size(), mTexUnits.data()); // Rasterizer State glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glFrontFace(GL_CCW); glDisable(GL_SCISSOR_TEST); // Blend State glDisable(GL_BLEND); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // Depth Stencil State glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glBindBuffer(GL_SHADER_STORAGE_BUFFER, mTransformBuffer); BufferData(GL_SHADER_STORAGE_BUFFER, _transforms, GL_DYNAMIC_DRAW); size_t xformCount = _transforms.size(); assert(xformCount <= mObjectCount); for (size_t u = 0; u < xformCount; ++u) { glDrawElementsInstancedBaseInstance(GL_TRIANGLES, mIndexCount, GL_UNSIGNED_SHORT, 0, 1, u); } }
// -------------------------------------------------------------------------------------------------------------------- void UntexturedObjectsGLDrawLoop::Render(const std::vector<Matrix>& _transforms) { size_t count = _transforms.size(); assert(count <= mObjectCount); // Program Vec3 dir = { -0.5f, -1, 1 }; Vec3 at = { 0, 0, 0 }; Vec3 up = { 0, 0, 1 }; dir = normalize(dir); Vec3 eye = at - 250 * dir; Matrix view = matrix_look_at(eye, at, up); Matrix view_proj = mProj * view; glUseProgram(m_prog); glUniformMatrix4fv(mUniformLocation.ViewProjection, 1, GL_TRUE, &view_proj.x.x); // Rasterizer State glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glDisable(GL_SCISSOR_TEST); // Blend State glDisable(GL_BLEND); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // Depth Stencil State glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_transform_buffer); glBufferData(GL_SHADER_STORAGE_BUFFER, _transforms.size() * sizeof(Matrix), &*_transforms.begin(), GL_DYNAMIC_DRAW); for (size_t u = 0; u < count; ++u) { glDrawElementsInstancedBaseInstance(GL_TRIANGLES, mIndexCount, GL_UNSIGNED_SHORT, nullptr, 1, u); } }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseInstanceBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jint baseinstance, jlong function_pointer) { const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); glDrawElementsInstancedBaseInstancePROC glDrawElementsInstancedBaseInstance = (glDrawElementsInstancedBaseInstancePROC)((intptr_t)function_pointer); glDrawElementsInstancedBaseInstance(mode, count, type, indices_address, primcount, baseinstance); }
void VertexArray::drawElementsInstancedBaseInstance(const GLenum mode, const GLsizei count, const GLenum type, const void* indices, const GLsizei instanceCount, const GLuint baseInstance) const { bind(); glDrawElementsInstancedBaseInstance(mode, count, type, indices, instanceCount, baseInstance); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL42_nglDrawElementsInstancedBaseInstance(JNIEnv *__env, jclass clazz, jint mode, jint count, jint type, jlong indicesAddress, jint primcount, jint baseinstance) { glDrawElementsInstancedBaseInstancePROC glDrawElementsInstancedBaseInstance = (glDrawElementsInstancedBaseInstancePROC)tlsGetFunction(865); intptr_t indices = (intptr_t)indicesAddress; UNUSED_PARAM(clazz) glDrawElementsInstancedBaseInstance(mode, count, type, indices, primcount, baseinstance); }
void VertexArrayObject::drawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instanceCount, GLuint baseInstance) { bind(); glDrawElementsInstancedBaseInstance(mode, count, type, indices, instanceCount, baseInstance); CheckGLError(); }