• Render texture to prop
    5 replies, posted
I'm trying to make a portal entity, and i can't seem to figure out what's causing a few things. When looking straight at the prop it works fine: [t]http://puu.sh/39xEN.jpg[/t] But when i pick up a prop (with physgun grab halo enabled, without it it doesnt happen), the render goes black: [t]http://puu.sh/39xFv.jpg[/t] And for some reason i can see the render through the prop its on, but not through different props: [t]http://puu.sh/39xGh.jpg[/t] [t]http://puu.sh/39xGJ.jpg[/t] And also the crosshair goes invisible as soon as i spawn one. Here's the rendering code: [code] include("shared.lua") ENT.RenderTarget = render.GetScreenEffectTexture() local matView = CreateMaterial( "UnlitGeneric", "GMODScreenspace", { ["$basetexture"] = ENT.RenderTarget, ["$basetexturetransform"] = "center .5 .5 scale -1 -1 rotate 0 translate 0 0", ["$texturealpha"] = "0", ["$vertexalpha"] = "1", } ) hook.Add("RenderScene", "WorldPortalRenderScene", function(origin, angles, fov) for _,ent in ipairs(ents.FindByClass("worldportal")) do ent:RenderScene(origin, angles, fov) end end) hook.Add("ShouldDrawLocalPlayer", "WorldPortalShouldDrawLocalPlayer", function(ply) if WorldPortalRender then return true end end) function ENT:Initialize() self:SetModelScale(1.2, 0) end function ENT:RenderScene(origin, angles, fov) local oldRT = render.GetRenderTarget() render.SetRenderTarget(self.RenderTarget) render.Clear(0, 0, 0, 255) render.ClearDepth() render.ClearStencil() WorldPortalRender = true render.RenderView({ x = 0, y = 0, w = ScrW(), h = ScrH(), origin = self:GetPos() + Vector(0,0,500), angles = LocalPlayer():EyeAngles(), drawviewmodel = false, drawhud = false }) WorldPortalRender = false render.UpdateScreenEffectTexture() render.SetRenderTarget(oldRT) end function ENT:Draw() self:DrawModel() if self.RenderTarget then matView:SetTexture("$basetexture", self.RenderTarget) render.SetMaterial(matView) mesh.Begin(MATERIAL_QUADS, 1) mesh.QuadEasy(self:GetPos() + Vector(-0.2, -23.2, 0), Vector(0, 1, 0), 40.5, -72) mesh.End() end end [/code]
You are better off getting your own render target rather than using the screen effect texture, be sure to also allocate a depth buffer.
[QUOTE=Wizard of Ass;40922259]You are better off getting your own render target rather than using the screen effect texture, be sure to also allocate a depth buffer.[/QUOTE] Great, i changed it to [code] ENT.RenderTarget = GetRenderTarget("WorldPortalRT", ScrW(), ScrH(), false) [/code] And now the crosshair doesn't disappear anymore, and it works when holding props. You can still see it through the box though, can you elaborate on the depth buffer?
GetRenderTargetEx is what you want to use.
[QUOTE=Wizard of Ass;40923795]GetRenderTargetEx is what you want to use.[/QUOTE] With which values for the flags exactly?
Old code of mine which basically does render a view to a texture. [lua] local TEXTURE_FLAGS_CLAMP_S = 0x0004 local TEXTURE_FLAGS_CLAMP_T = 0x0008 local rt = GetRenderTargetEx("testRT", 512, 512, RT_SIZE_NO_CHANGE, MATERIAL_RT_DEPTH_SEPERATE, TEXTURE_FLAGS_CLAMP_S | TEXTURE_FLAGS_CLAMP_T, CREATERENDERTARGETFLAGS_UNFILTERABLE_OK ) local drawMaterial = CreateMaterial("TestRT","UnlitGeneric",{ ["$ignorez"] = 1, ["$vertexcolor"] = 1, ["$vertexalpha"] = 1, ["$nolod"] = 1, ["$basetexture"] = rt:GetName() }) local view = { angles = Angle(), origin = Vector(), x = 0, y = 0, w = 512, h = 512, drawhud = false, drawviewmodel = false, } local inDraw = false function ENT:Draw() self:DrawModel() if(inDraw) then return end inDraw = true local pos = self:GetPos() local ang = self:GetAngles() ang:RotateAroundAxis(ang:Forward(), 90) ang:RotateAroundAxis(ang:Right(), 90) local oldRT = render.GetRenderTarget() render.SetRenderTarget(rt) render.Clear(0, 0, 0, 255) render.ClearDepth() local w, h = ScrW(), ScrH() render.SetViewPort(0, 0, 512, 512) cam.Start2D() render.RenderView(view) surface.SetDrawColor((math.cos(math.rad(RealTime()*120))+1)*127.5) surface.DrawRect(0, 0, 4, 4) cam.End2D() render.SetViewPort(0, 0, w, h) render.SetRenderTarget(oldRT) cam.Start3D2D(pos, ang, 1) surface.SetMaterial(drawMaterial) surface.SetDrawColor(255, 255, 255, 255) surface.DrawTexturedRect(0, 0, 512, 512) cam.End3D2D() inDraw = false end [/lua]
Sorry, you need to Log In to post a reply to this thread.