Преглед изворни кода

Add gpu program uniforms support

Daniele Bartolini пре 12 година
родитељ
комит
655dd47768
3 измењених фајлова са 141 додато и 26 уклоњено
  1. 19 8
      src/renderers/Renderer.h
  2. 99 16
      src/renderers/gl/GLRenderer.cpp
  3. 23 2
      src/renderers/gl/GLRenderer.h

+ 19 - 8
src/renderers/Renderer.h

@@ -40,12 +40,6 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 namespace crown
 {
 {
 
 
-class Image;
-class VertexBuffer;
-class IndexBuffer;
-class OcclusionQuery;
-class TextureResource;
-
 enum MatrixType
 enum MatrixType
 {
 {
 	MT_VIEW			= 0,
 	MT_VIEW			= 0,
@@ -71,12 +65,19 @@ typedef Id VertexShaderId;
 typedef Id PixelShaderId;
 typedef Id PixelShaderId;
 typedef Id GPUProgramId;
 typedef Id GPUProgramId;
 
 
+class VertexBuffer;
+class IndexBuffer;
+class Vec2;
+class Vec3;
+class Vec4;
+class Mat4;
+
 class Renderer
 class Renderer
 {
 {
 public:
 public:
 
 
-	Renderer() {}
-	virtual ~Renderer() {}
+							Renderer() {}
+	virtual					~Renderer() {}
 
 
 	/// Creates a new vertex buffer optimized for rendering static vertex data.
 	/// Creates a new vertex buffer optimized for rendering static vertex data.
 	/// @vertices is the array containig @count vertex data elements of the given @format.
 	/// @vertices is the array containig @count vertex data elements of the given @format.
@@ -117,6 +118,16 @@ public:
 	virtual GPUProgramId	create_gpu_program(VertexShaderId vs, PixelShaderId ps) = 0;
 	virtual GPUProgramId	create_gpu_program(VertexShaderId vs, PixelShaderId ps) = 0;
 	virtual void			destroy_gpu_program(GPUProgramId id) = 0;
 	virtual void			destroy_gpu_program(GPUProgramId id) = 0;
 
 
+	virtual void			set_gpu_program_bool_uniform(GPUProgramId id, const char* name, bool value) = 0;
+	virtual void			set_gpu_program_int_uniform(GPUProgramId id, const char* name, int value) = 0;
+
+	virtual void			set_gpu_program_vec2_uniform(GPUProgramId id, const char* name, const Vec2& value) = 0;
+	virtual void			set_gpu_program_vec3_uniform(GPUProgramId id, const char* name, const Vec3& value) = 0;
+	virtual void			set_gpu_program_vec4_uniform(GPUProgramId id, const char* name, const Vec4& value) = 0;
+
+	virtual void			set_gpu_porgram_mat3_uniform(GPUProgramId id, const char* name, const Mat3& value) = 0;
+	virtual void			set_gpu_program_mat4_uniform(GPUProgramId id, const char* name, const Mat4& value) = 0;
+
 	virtual void			bind_gpu_program(GPUProgramId id) const = 0;
 	virtual void			bind_gpu_program(GPUProgramId id) const = 0;
 
 
 	//virtual RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format) = 0;
 	//virtual RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format) = 0;

+ 99 - 16
src/renderers/gl/GLRenderer.cpp

@@ -34,8 +34,11 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "GLUtils.h"
 #include "GLUtils.h"
 #include "Log.h"
 #include "Log.h"
 #include "Material.h"
 #include "Material.h"
-#include "TextureResource.h"
+#include "Vec2.h"
 #include "Vec3.h"
 #include "Vec3.h"
+#include "Vec4.h"
+#include "Mat3.h"
+#include "Mat4.h"
 
 
 #if defined(WINDOWS)
 #if defined(WINDOWS)
 	//Define the missing constants in vs' gl.h
 	//Define the missing constants in vs' gl.h
@@ -449,6 +452,76 @@ void GLRenderer::destroy_gpu_program(GPUProgramId id)
 	glDeleteProgram(gl_program.gl_object);
 	glDeleteProgram(gl_program.gl_object);
 }
 }
 
 
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_bool_uniform(GPUProgramId id, const char* name, bool value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniform1i(uniform, (GLint) value);
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_int_uniform(GPUProgramId id, const char* name, int value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniform1i(uniform, (GLint) value);
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_vec2_uniform(GPUProgramId id, const char* name, const Vec2& value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniform2fv(uniform, 1, value.to_float_ptr());
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_vec3_uniform(GPUProgramId id, const char* name, const Vec3& value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniform3fv(uniform, 1, value.to_float_ptr());
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_vec4_uniform(GPUProgramId id, const char* name, const Vec4& value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniform4fv(uniform, 1, value.to_float_ptr());
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_porgram_mat3_uniform(GPUProgramId id, const char* name, const Mat3& value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniformMatrix3fv(uniform, 1, GL_TRUE, value.to_float_ptr());
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::set_gpu_program_mat4_uniform(GPUProgramId id, const char* name, const Mat4& value)
+{
+	assert(m_gpu_programs_id_table.has(id));
+
+	const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
+
+	glUniformMatrix4fv(uniform, 1, GL_TRUE, value.to_float_ptr());
+}
+
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void GLRenderer::bind_gpu_program(GPUProgramId id) const
 void GLRenderer::bind_gpu_program(GPUProgramId id) const
 {
 {
@@ -1006,20 +1079,6 @@ void GLRenderer::draw_triangles(IndexBufferId id) const
 // 	const GLRenderBuffer& render_buffer = m_render_buffers[id.index];
 // 	const GLRenderBuffer& render_buffer = m_render_buffers[id.index];
 // }
 // }
 
 
-//-----------------------------------------------------------------------------
-bool GLRenderer::activate_texture_unit(uint32_t unit)
-{
-	if (unit >= (uint32_t) m_max_texture_units)
-	{
-		return false;
-	}
-
-	glActiveTexture(GL_TEXTURE0 + unit);
-	m_active_texture_unit = unit;
-
-	return true;
-}
-
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void GLRenderer::set_light(uint32_t light, bool active)
 void GLRenderer::set_light(uint32_t light, bool active)
 {
 {
@@ -1092,7 +1151,31 @@ void GLRenderer::draw_lines(const float* vertices, const float* colors, uint32_t
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-void GLRenderer::check_gl_errors()
+bool GLRenderer::activate_texture_unit(uint32_t unit)
+{
+	if (unit >= (uint32_t) m_max_texture_units)
+	{
+		return false;
+	}
+
+	glActiveTexture(GL_TEXTURE0 + unit);
+	m_active_texture_unit = unit;
+
+	return true;
+}
+
+//-----------------------------------------------------------------------------
+GLint GLRenderer::find_gpu_program_uniform(GLuint program, const char* name) const
+{
+	GLint uniform = glGetUniformLocation(program, name);
+
+	assert(uniform != -1);
+
+	return uniform;
+}
+
+//-----------------------------------------------------------------------------
+void GLRenderer::check_gl_errors() const
 {
 {
 	GLenum error;
 	GLenum error;
 
 

+ 23 - 2
src/renderers/gl/GLRenderer.h

@@ -98,29 +98,46 @@ public:
 						GLRenderer();
 						GLRenderer();
 						~GLRenderer();
 						~GLRenderer();
 
 
+	// Vertex buffers
 	VertexBufferId		create_vertex_buffer(size_t count, VertexFormat format, const void* vertices);
 	VertexBufferId		create_vertex_buffer(size_t count, VertexFormat format, const void* vertices);
 	VertexBufferId		create_dynamic_vertex_buffer(size_t count, VertexFormat format, const void* vertices);
 	VertexBufferId		create_dynamic_vertex_buffer(size_t count, VertexFormat format, const void* vertices);
 	void				update_vertex_buffer(VertexBufferId id, size_t offset, size_t count, const void* vertices);
 	void				update_vertex_buffer(VertexBufferId id, size_t offset, size_t count, const void* vertices);
 	void				destroy_vertex_buffer(VertexBufferId id);
 	void				destroy_vertex_buffer(VertexBufferId id);
 
 
+	// Index buffers
 	IndexBufferId		create_index_buffer(size_t count, const void* indices);
 	IndexBufferId		create_index_buffer(size_t count, const void* indices);
 	void				destroy_index_buffer(IndexBufferId id);
 	void				destroy_index_buffer(IndexBufferId id);
 
 
+	// Textures
 	TextureId			create_texture(uint32_t width, uint32_t height, PixelFormat format, const void* data);
 	TextureId			create_texture(uint32_t width, uint32_t height, PixelFormat format, const void* data);
 	void				update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data);
 	void				update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data);
 	void				destroy_texture(TextureId id);
 	void				destroy_texture(TextureId id);
 
 
+	// Vertex shaders
 	VertexShaderId		create_vertex_shader(const char* program);
 	VertexShaderId		create_vertex_shader(const char* program);
 	void				destroy_vertex_shader(VertexShaderId id);
 	void				destroy_vertex_shader(VertexShaderId id);
 
 
+	// Pixel shaders
 	PixelShaderId 		create_pixel_shader(const char* program);
 	PixelShaderId 		create_pixel_shader(const char* program);
 	void				destroy_pixel_shader(PixelShaderId id);
 	void				destroy_pixel_shader(PixelShaderId id);
 
 
+	// GPU programs
 	GPUProgramId		create_gpu_program(VertexShaderId vs, PixelShaderId ps);
 	GPUProgramId		create_gpu_program(VertexShaderId vs, PixelShaderId ps);
 	void				destroy_gpu_program(GPUProgramId id);
 	void				destroy_gpu_program(GPUProgramId id);
 
 
+	void				set_gpu_program_bool_uniform(GPUProgramId id, const char* name, bool value);
+	void				set_gpu_program_int_uniform(GPUProgramId id, const char* name, int value);
+
+	void				set_gpu_program_vec2_uniform(GPUProgramId id, const char* name, const Vec2& value);
+	void				set_gpu_program_vec3_uniform(GPUProgramId id, const char* name, const Vec3& value);
+	void				set_gpu_program_vec4_uniform(GPUProgramId id, const char* name, const Vec4& value);
+
+	void				set_gpu_porgram_mat3_uniform(GPUProgramId id, const char* name, const Mat3& value);
+	void				set_gpu_program_mat4_uniform(GPUProgramId id, const char* name, const Mat4& value);
+
 	void				bind_gpu_program(GPUProgramId id) const;
 	void				bind_gpu_program(GPUProgramId id) const;
 
 
+	// Frame buffers
 	// RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format);
 	// RenderBufferId	create_render_buffer(uint32_t width, uint32_t height, PixelFormat format);
 	// void				destroy_render_buffer(RenderBufferId id);
 	// void				destroy_render_buffer(RenderBufferId id);
 
 
@@ -191,11 +208,15 @@ public:
 
 
 private:
 private:
 
 
-	/// Activates a texture unit and returns true if succes
+	// Activates a texture unit and returns true if succes
 	bool				activate_texture_unit(uint32_t unit);
 	bool				activate_texture_unit(uint32_t unit);
 	bool				activate_light(uint32_t light);
 	bool				activate_light(uint32_t light);
 
 
-	void				check_gl_errors();
+	// Shaders
+	GLint				find_gpu_program_uniform(GLuint program, const char* name) const;
+
+	// GL error checking
+	void				check_gl_errors() const;
 
 
 private:
 private: