bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glVertexAttribFormatNV(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertex)); glVertexAttribFormatNV(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(vertex)); glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
// -------------------------------------------------------------------------------------------------------------------- void UntexturedObjectsGLBindless::Render(const std::vector<Matrix>& _transforms) { // 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 viewProj = mProj * view; glUseProgram(m_prog); glUniformMatrix4fv(mUniformLocation.ViewProjection, 1, GL_TRUE, &viewProj.x.x); // Input Layout glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV); glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV); glVertexAttribFormatNV(0, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); glVertexAttribFormatNV(1, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); // 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); for (size_t u = 0; u < _transforms.size(); ++u) { glBufferAddressRangeNV(GL_ELEMENT_ARRAY_ADDRESS_NV, 0, m_ib_addrs[u], m_ib_sizes[u]); glBufferAddressRangeNV(GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV, 0, m_vbo_addrs[u] + offsetof(UntexturedObjectsProblem::Vertex, pos), m_vbo_sizes[u] - offsetof(UntexturedObjectsProblem::Vertex, pos)); glBufferAddressRangeNV(GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV, 1, m_vbo_addrs[u] + offsetof(UntexturedObjectsProblem::Vertex, color), m_vbo_sizes[u] - offsetof(UntexturedObjectsProblem::Vertex, color)); glUniformMatrix4fv(mUniformLocation.World, 1, GL_FALSE, &_transforms[u].x.x); glDrawElements(GL_TRIANGLES, mIndexCount, GL_UNSIGNED_SHORT, nullptr); } }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVVertexBufferUnifiedMemory_nglVertexAttribFormatNV(JNIEnv *env, jclass clazz, jint index, jint size, jint type, jboolean normalized, jint stride, jlong function_pointer) { glVertexAttribFormatNVPROC glVertexAttribFormatNV = (glVertexAttribFormatNVPROC)((intptr_t)function_pointer); glVertexAttribFormatNV(index, size, type, normalized, stride); }
// -------------------------------------------------------------------------------------------------------------------- void UntexturedObjectsGLBindlessIndirect::Render(const std::vector<Matrix>& _transforms) { const auto xformCount = _transforms.size(); const auto objCount = m_commands.size(); assert(xformCount == objCount); // 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(0, 1, GL_TRUE, &view_proj.x.x); // Input Layout glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV); glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glVertexAttribFormatNV(0, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); glVertexAttribFormatNV(1, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); // 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); size_t i = 0; for (auto it = m_commands.begin(); it != m_commands.end(); ++it) { Command *cmd = &*it; cmd->Draw.count = mIndexCount; cmd->Draw.instanceCount = 1; cmd->Draw.firstIndex = 0; cmd->Draw.baseVertex = 0; cmd->Draw.baseInstance = 0; cmd->reserved = 0; cmd->indexBuffer.index = 0; cmd->indexBuffer.reserved = 0; cmd->indexBuffer.address = m_ib_addrs[i]; cmd->indexBuffer.length = m_ib_sizes[i]; cmd->vertexBuffers[0].index = 0; cmd->vertexBuffers[0].reserved = 0; cmd->vertexBuffers[0].address = m_vbo_addrs[i] + offsetof(UntexturedObjectsProblem::Vertex, pos); cmd->vertexBuffers[0].length = m_vbo_sizes[i] - offsetof(UntexturedObjectsProblem::Vertex, pos); cmd->vertexBuffers[1].index = 1; cmd->vertexBuffers[1].reserved = 0; cmd->vertexBuffers[1].address = m_vbo_addrs[i] + offsetof(UntexturedObjectsProblem::Vertex, color); cmd->vertexBuffers[1].length = m_vbo_sizes[i] - offsetof(UntexturedObjectsProblem::Vertex, color); ++i; } memcpy(m_transform_ptr, &*_transforms.begin(), sizeof(Matrix) * xformCount); memcpy(m_cmd_ptr, &*m_commands.begin(), sizeof(Command) * objCount); glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); // resolveQueries(); // glBeginQuery(GL_TIME_ELAPSED, m_queries[m_currentQueryIssue]); glMultiDrawElementsIndirectBindlessNV(GL_TRIANGLES, GL_UNSIGNED_SHORT, nullptr, objCount, 0, 2); // glEndQuery(GL_TIME_ELAPSED); // m_currentQueryIssue = (m_currentQueryIssue + 1) % kQueryCount; }