bool D3DVertexBuffer::create(const VertexLayout& layout, int length, int usage) { mStride = layout.getStride(); D3D11_BUFFER_DESC desc = {0}; desc.ByteWidth = mStride * length; desc.Usage = D3D11_USAGE_DYNAMIC; desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; desc.MiscFlags = 0; desc.StructureByteStride = 0; HRESULT hr = mDevice.getDevice().CreateBuffer(&desc, NULL, &mpBuffer); if ( FAILED(hr) ) return false; return true; }
void Vao::initialize(RenderState& rs, ShaderProgram& _program, const VertexOffsets& _vertexOffsets, VertexLayout& _layout, GLuint _vertexBuffer, GLuint _indexBuffer) { m_glVAOs.resize(_vertexOffsets.size()); GL::genVertexArrays(m_glVAOs.size(), m_glVAOs.data()); fastmap<std::string, GLuint> locations; // FIXME (use a bindAttrib instead of getLocation) to make those locations shader independent for (auto& attrib : _layout.getAttribs()) { GLint location = _program.getAttribLocation(attrib.name); locations[attrib.name] = location; } rs.vertexBuffer(_vertexBuffer); int vertexOffset = 0; for (size_t i = 0; i < _vertexOffsets.size(); ++i) { auto vertexIndexOffset = _vertexOffsets[i]; int nVerts = vertexIndexOffset.second; GL::bindVertexArray(m_glVAOs[i]); // ELEMENT_ARRAY_BUFFER must be bound after bindVertexArray to be used by VAO if (_indexBuffer != 0) { rs.indexBufferUnset(_indexBuffer); rs.indexBuffer(_indexBuffer); } // Enable vertex layout on the specified locations _layout.enable(locations, vertexOffset * _layout.getStride()); vertexOffset += nVerts; } GL::bindVertexArray(0); rs.vertexBuffer(0); rs.indexBuffer(0); }