【Defold】RenderCam アセットを使いつつカラーグレーディングに対応する

DEVELOP

【Defold】カラーグレーディングに対応する | KAZUPON研究室 ここで対応したカラーグレーディングはデフォルトのカメラスクリプトに対してのものなので RenderCam アセット版を書いてみました。

サンプルコード


local rendercam = require "rendercam.rendercam"
local vp = rendercam.viewport
local IDENTITY_MATRIX = vmath.matrix4()
local CLEAR_COLOR = hash("clear_color")
local WINDOW_RESIZED = hash("window_resized")
local UPDATE_WINDOW = hash("update window")
local function update_window(self)
	rendercam.update_window(render.get_window_width(), render.get_window_height())
	self.gui_proj = vmath.matrix4_orthographic(0, rendercam.window.x, 0, rendercam.window.y, -1, 1)
end
function init(self)
	self.tile_pred = render.predicate({"tile"})
	self.gui_pred = render.predicate({"gui"})
	self.text_pred = render.predicate({"text"})
	self.model_pred = render.predicate({"model"})
	self.particle_pred = render.predicate({"particle"})
	-- add
	self.grade_pred = render.predicate({"grade"})
	self.clear_color = vmath.vector4(0)
	rendercam.configWin.x = render.get_width();  rendercam.configWin.y = render.get_height()
	rendercam.update_window_size(render.get_window_width(), render.get_window_height())
	update_window(self)
	-- add 1
	local color_params = { format = render.FORMAT_RGBA,
	width = render.get_width(),
	height = render.get_height() }
	local target_params = {[render.BUFFER_COLOR_BIT] = color_params }
	self.target = render.render_target("original", target_params)
	
end
function update(self)
	-- add --
	render.enable_render_target(self.target)
	
	render.set_depth_mask(true)
	render.set_stencil_mask(0xff)
	render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [render.BUFFER_STENCIL_BIT] = 0})
--	render.set_viewport(vp.x, vp.y, vp.width, vp.height)
	render.set_viewport(0, 0, render.get_width(), render.get_height())
	render.set_view(rendercam.calculate_view())
	render.set_projection(rendercam.calculate_proj())
	-- Sprite and particle rendering
	render.set_depth_mask(false)
	render.disable_state(render.STATE_DEPTH_TEST)
	render.disable_state(render.STATE_STENCIL_TEST)
	render.enable_state(render.STATE_BLEND)
	render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
	render.disable_state(render.STATE_CULL_FACE)
	render.draw(self.tile_pred)
	render.draw(self.particle_pred)
	-- Model rendering
	render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
	render.enable_state(render.STATE_CULL_FACE)
	render.enable_state(render.STATE_DEPTH_TEST)
	render.set_depth_mask(true)
	render.draw(self.model_pred)
	-- Debug rendering - physics debug, draw_line
	render.disable_state(render.STATE_DEPTH_TEST)
	render.disable_state(render.STATE_CULL_FACE)
	render.draw_debug3d()
	-- add --
	render.disable_render_target(self.target)
	render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color})
  
	render.set_viewport(0, 0, rendercam.window.x, rendercam.window.y)
	render.set_view(IDENTITY_MATRIX)
	render.set_projection(IDENTITY_MATRIX)
	render.enable_texture(0, self.target, render.BUFFER_COLOR_BIT)
	render.draw(self.grade_pred)
	render.disable_texture(0, self.target)
	-- GUI Rendering
	render.set_viewport(0, 0, rendercam.window.x, rendercam.window.y)
	render.set_view(IDENTITY_MATRIX)
	render.set_projection(self.gui_proj) -- gui_proj only calculated on update_window
	render.enable_state(render.STATE_STENCIL_TEST)
	render.draw(self.gui_pred)
	render.draw(self.text_pred) -- Includes debug text from "draw_text" messages.
	render.disable_state(render.STATE_STENCIL_TEST)
  
	
end
function on_message(self, message_id, message)
	if message_id == CLEAR_COLOR then
		self.clear_color = message.color
	elseif message_id == WINDOW_RESIZED then -- sent by engine
		update_window(self)
	elseif message_id == UPDATE_WINDOW then -- sent by rendercam when a camera is activated ("window_resized" engine message requires data)
		update_window(self)
	end
end

Posted by kazupon