private void ColorCodedRender(RenderEventArgs arg, IndexBufferPtr temporaryIndexBufferPtr = null) { UpdatePolygonMode(arg.PickingGeometryType); ShaderProgram program = this.Program; // 绑定shader program.Bind(); program.SetUniform("pickingBaseId", temporaryIndexBufferPtr == null ? (int)this.PickingBaseId : 0); UniformMat4 uniformmMVP4Picking = this.uniformmMVP4Picking; bool mvpUpdated = uniformmMVP4Picking.Updated; if (mvpUpdated) { uniformmMVP4Picking.SetUniform(program); } PickingSwitchesOn(); GLSwitch primitiveRestartIndexSwitch = null; var oneIndexBufferPtr = temporaryIndexBufferPtr as OneIndexBufferPtr; if (oneIndexBufferPtr != null) { primitiveRestartIndexSwitch = new PrimitiveRestartSwitch(oneIndexBufferPtr); primitiveRestartIndexSwitch.On(); } if (this.vertexArrayObject == null) { var vertexArrayObject = new VertexArrayObject( this.indexBufferPtr, this.positionBufferPtr); vertexArrayObject.Create(arg, program); this.vertexArrayObject = vertexArrayObject; } //else { this.vertexArrayObject.Render(arg, program, temporaryIndexBufferPtr); } if (oneIndexBufferPtr != null) { primitiveRestartIndexSwitch.Off(); } PickingSwitchesOff(); if (mvpUpdated) { uniformmMVP4Picking.ResetUniform(program); } // 解绑shader program.Unbind(); }
//private Stack<UniformArrayVariable> uniformArrayVariableStack = new Stack<UniformArrayVariable>(); /// <summary> /// /// </summary> /// <param name="arg"></param> protected override void DoRender(RenderEventArgs arg) { ShaderProgram program = this.Program; if (program == null) { return; } // 绑定shader program.Bind(); SetUniformValues(program); SwitchesOn(); IndexBufferPtr indexBufferPtr = this.indexBufferPtr; if (this.vertexArrayObject == null) { PropertyBufferPtr[] propertyBufferPtrs = this.propertyBufferPtrs; if (indexBufferPtr != null && propertyBufferPtrs != null) { var vertexArrayObject = new VertexArrayObject( indexBufferPtr, propertyBufferPtrs); vertexArrayObject.Create(arg, program); this.vertexArrayObject = vertexArrayObject; } } { VertexArrayObject vertexArrayObject = this.vertexArrayObject; if (vertexArrayObject != null) { if (vertexArrayObject.IndexBufferPtr != indexBufferPtr) { vertexArrayObject.Render(arg, program, indexBufferPtr); } else { vertexArrayObject.Render(arg, program); } } } SwithesOff(); ResetUniformValues(program); // 解绑shader program.Unbind(); }
private void RenderRender(RenderEventArgs e) { ShaderProgram program = this.shaderProgram; // 绑定shader program.Bind(); var updatedUniforms = (from item in this.uniformVariables where item.Updated select item).ToArray(); foreach (var item in updatedUniforms) { item.SetUniform(program); } foreach (var item in switchList) { item.On(); } if (this.vertexArrayObject == null) { var vertexArrayObject = new VertexArrayObject( this.indexBufferPtr, this.propertyBufferPtrs); vertexArrayObject.Create(e, program); this.vertexArrayObject = vertexArrayObject; } //else { this.vertexArrayObject.Render(e, program); } foreach (var item in switchList) { item.Off(); } foreach (var item in updatedUniforms) { item.ResetUniform(program); item.Updated = false; } // 解绑shader program.Unbind(); }
private void ColorCodedPickingRender(RenderEventArgs e) { if (this.pickingShaderProgram == null) { this.pickingShaderProgram = PickingShaderHelper.GetPickingShaderProgram(); } ShaderProgram program = this.pickingShaderProgram; // 绑定shader program.Bind(); var picking = this as IColorCodedPicking; // TODO: use uint/int/float or ? use UniformUInt instead program.SetUniform("pickingBaseID", picking.PickingBaseID); pickingMVP.SetUniform(program); foreach (var item in switchList) { item.On(); } if (this.vertexArrayObject4Picking == null) { var vertexArrayObject4Picking = new VertexArrayObject( this.indexBufferPtr, this.positionBufferPtr); vertexArrayObject4Picking.Create(e, program); this.vertexArrayObject4Picking = vertexArrayObject4Picking; } //else { this.vertexArrayObject4Picking.Render(e, program); } foreach (var item in switchList) { item.Off(); } pickingMVP.ResetUniform(program); // 解绑shader program.Unbind(); }
protected override void DoRender(RenderEventArgs arg) { UpdatePolygonMode(arg.PickingGeometryType); ShaderProgram program = this.shaderProgram; // 绑定shader program.Bind(); program.SetUniform("pickingBaseId", (int)this.PickingBaseId); UniformMat4 uniformmMVP4Picking = this.uniformmMVP4Picking; bool mvpUpdated = uniformmMVP4Picking.Updated; if (mvpUpdated) { uniformmMVP4Picking.SetUniform(program); } PickingSwitchesOn(); if (this.vertexArrayObject == null) { var vertexArrayObject4Picking = new VertexArrayObject( this.indexBufferPtr, this.positionBufferPtr); vertexArrayObject4Picking.Create(arg, program); this.vertexArrayObject = vertexArrayObject4Picking; } //else { this.vertexArrayObject.Render(arg, program); } PickingSwitchesOff(); if (mvpUpdated) { uniformmMVP4Picking.ResetUniform(program); } // 解绑shader program.Unbind(); }
protected override void DoRender(RenderEventArgs arg) { ShaderProgram program = this.shaderProgram; if (program == null) { return; } // 绑定shader program.Bind(); var updatedUniforms = (from item in this.uniformVariables where item.Updated select item).ToArray(); foreach (var item in updatedUniforms) { item.SetUniform(program); } int count = this.switchList.Count; for (int i = 0; i < count; i++) { this.switchList[i].On(); } IndexBufferPtr indexBufferPtr = this.indexBufferPtr; if (this.vertexArrayObject == null) { PropertyBufferPtr[] propertyBufferPtrs = this.propertyBufferPtrs; if (indexBufferPtr != null && propertyBufferPtrs != null) { var vertexArrayObject = new VertexArrayObject( indexBufferPtr, propertyBufferPtrs); vertexArrayObject.Create(arg, program); this.vertexArrayObject = vertexArrayObject; } } { VertexArrayObject vertexArrayObject = this.vertexArrayObject; if (vertexArrayObject != null) { if (vertexArrayObject.IndexBufferPtr != indexBufferPtr) { vertexArrayObject.IndexBufferPtr = indexBufferPtr; } vertexArrayObject.Render(arg, program); } } for (int i = count - 1; i >= 0; i--) { this.switchList[i].Off(); } foreach (var item in updatedUniforms) { item.ResetUniform(program); } // 解绑shader program.Unbind(); }