Explorar el Código

added frame counter and basic forward rendering shader code

Zoadian hace 11 años
padre
commit
5b5d1c4d88
Se han modificado 2 ficheros con 72 adiciones y 8 borrados
  1. 10 0
      source/app.d
  2. 62 8
      source/three/renderer.d

+ 10 - 0
source/app.d

@@ -130,6 +130,8 @@ void main() {
 	//------------------------------------------------
 	// Main Loop
 	//------------------------------------------------
+	ulong frameCount = 0;
+	glfwSetTime(0);
 	while(keepRunning) {
 		window.pollEvents();
 
@@ -144,6 +146,14 @@ void main() {
 		TwDraw();
 
 		window.swapBuffers();
+
+		++frameCount;
+		if(frameCount % 1000 == 0) {
+			auto fps = cast(double)frameCount / glfwGetTime();
+			log("FPS: ", fps);
+			frameCount = 0;
+			glfwSetTime(0);
+		}
 	}
 }
 

+ 62 - 8
source/three/renderer.d

@@ -6,7 +6,40 @@ import three.camera;
 import three.renderTarget;
 import three.viewport;
 
+enum forwardRendererVertexShaderSource = "
+	#version 420 core
 
+	layout(location = 0) in vec3 in_position;
+	layout(location = 1) in vec3 in_normal;
+	layout(location = 2) in vec2 in_texcoord;
+	layout(location = 3) in vec4 in_color;
+
+
+	out vec4 v_color;	
+
+	out gl_PerVertex 
+	{
+    	vec4 gl_Position;
+ 	};
+
+	void main()
+	{
+		gl_Position = vec4(0.005 * in_position.x, 0.005 * in_position.y, 0.005* in_position.z, 1.0);
+    	v_color = in_color;
+	}
+";
+
+enum forwardRendererFragmentShaderSource = "
+	#version 420 core
+	in vec4 v_color;
+
+	out vec4 FragColor;
+
+	void main()
+	{
+		FragColor = v_color;
+	}
+";
 
 struct GBuffer {
 	uint width;
@@ -82,7 +115,26 @@ struct Pipeline {
 }
 
 void construct(out Pipeline pipeline) nothrow {
-	glGenProgramPipelines(1, &pipeline.pipeline); 
+	glCheck!glGenProgramPipelines(1, &pipeline.pipeline); 
+
+	import std.string : toStringz;
+	auto szVertexSource = [forwardRendererVertexShaderSource.toStringz()];
+	pipeline.vertexShaderGeometryPass = glCheck!glCreateShaderProgramv(GL_VERTEX_SHADER, 1, szVertexSource.ptr);
+
+	auto szFragmentSource = [forwardRendererFragmentShaderSource.toStringz()];
+	pipeline.fragmentShaderGeometryPass = glCheck!glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, szFragmentSource.ptr);
+
+	glCheck!glUseProgramStages(pipeline.pipeline, GL_VERTEX_SHADER_BIT, pipeline.vertexShaderGeometryPass);
+	glCheck!glUseProgramStages(pipeline.pipeline, GL_FRAGMENT_SHADER_BIT, pipeline.fragmentShaderGeometryPass);
+
+	glCheck!glActiveShaderProgram(pipeline.pipeline, pipeline.vertexShaderGeometryPass);
+	glCheck!glActiveShaderProgram(pipeline.pipeline, pipeline.fragmentShaderGeometryPass);
+
+	glCheck!glValidateProgramPipeline(pipeline.pipeline); 
+	GLint status;
+	glCheck!glGetProgramPipelineiv(pipeline.pipeline, GL_VALIDATE_STATUS, &status);
+	//TODO: add error handling
+	assert(status != 0);
 }
 
 void destruct(ref Pipeline pipeline) nothrow {
@@ -98,15 +150,17 @@ struct OpenGlTiledDeferredRenderer {
 
 void construct(out OpenGlTiledDeferredRenderer deferredRenderer, uint width, uint height) nothrow {
 	deferredRenderer.gBuffer.construct(width, height);
+	deferredRenderer.pipeline.construct();
 }
 
 void destruct(ref OpenGlTiledDeferredRenderer deferredRenderer) nothrow {
+	deferredRenderer.pipeline.destruct();
 	deferredRenderer.gBuffer.destruct();
 	deferredRenderer = OpenGlTiledDeferredRenderer.init;
 }
 
 // draw the scene supersampled with renderer's with+height onto renderTarget at position+size of viewport
-void renderOneFrame(ref OpenGlTiledDeferredRenderer renderer, ref Scene scene, ref Camera camera, ref RenderTarget renderTarget, ref Viewport viewport) nothrow {
+void renderOneFrame(ref OpenGlTiledDeferredRenderer renderer, ref Scene scene, ref Camera camera, ref RenderTarget renderTarget, ref Viewport viewport) {
 	// 1. Render the (opaque) geometry into the G-Buffers.	
 	// 2. Construct a screen space grid, covering the frame buffer, with some fixed tile
 	//    size, t = (x, y), e.g. 32 × 32 pixels.	
@@ -126,12 +180,12 @@ void renderOneFrame(ref OpenGlTiledDeferredRenderer renderer, ref Scene scene, r
 	glCheck!glDepthFunc(GL_LEQUAL);
 	
 	//bind gBuffer
-	glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, renderer.gBuffer.fbo); scope(exit) glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
-	glCheck!glDrawBuffer(GL_COLOR_ATTACHMENT0 + 0);
-	glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-	GLenum[] drawBuffers = [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2];
-	glCheck!glDrawBuffers(drawBuffers.length, drawBuffers.ptr);
-	glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+//	glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, renderer.gBuffer.fbo); scope(exit) glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
+//	glCheck!glDrawBuffer(GL_COLOR_ATTACHMENT0 + 0);
+//	glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+//	GLenum[] drawBuffers = [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2];
+//	glCheck!glDrawBuffers(drawBuffers.length, drawBuffers.ptr);
+//	glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 	
 	//bind pipeline
 	glCheck!glBindProgramPipeline(renderer.pipeline.pipeline); scope(exit) glCheck!glBindProgramPipeline(0);