Render Referansı - Render Hedefleri

Render Kütüphanesi Referansları

Bu sayfa, Render Kütüphanesi'ni belgelemeye adanmış bir dizi sayfa olan Render Referansı'nın bir parçasıdır.

Diğer Render Referansı sayfaları şunları içerir:

Render Hedefleri Nedir?

Render Hedefi, oyunun dosyalarından yüklenen önceden var olan bir görüntüden ziyade, oyun sırasında oyunun kodu aracılığıyla oluşturulan özel bir doku türüdür. Diğer dokular gibi, Render Hedefleri de bir HUD öğesi gibi 2D görüntüler olarak veya 3D nesnelerde kullanılacak Materyaller için temel doku olarak çizilebilir.

Render Hedefleri, ilk oluşturulduklarında tanımlanan, piksel cinsinden ölçülen sabit bir çözünürlüğe sahiptir.
Özel kullanım durumunuzun aksini gerektiren bir nedeni yoksa, oyunun render çözünürlüğünü kullanmanız önerilir ( ScrW ve ScrH aracılığıyla elde edilir.)

Render Hedeflerinin 3 katmanı vardır:

  1. Renk Kanalı (veya kısaca "Renk")
    • Render Hedefi ekrana çizildiğinde görülecek olan şey budur.
    • Render Hedefinin Renk Kanalındaki her pikselin bir kırmızı, yeşil, mavi ve alfa değeri vardır.
  2. Derinlik Tamponu (veya kısaca "Derinlik")
    • Bu katman, Render Hedefindeki her pikselin kameradan ne kadar uzakta olduğunu takip eder.
    • Derinlik Tamponundaki her piksel, 0-255 arasında bir tam sayı değerine sahiptir; burada 0 kameraya yakın, 255 ise kameradan uzaktır.
  3. Stencil Tamponu (veya kısaca "Stenciller")
    • Stencil katmanı, Render Hedefindeki her bir pikselin çizim ve render işlemleriyle değiştirilip değiştirilemeyeceğini kontrol eder.
    • Stencil tamponundaki her piksel, 0-255 arasında bir tam sayı değerine sahiptir.
    • Varsayılan olarak, Stencil katmanı tüm piksellere çizim yapılabilecek şekilde yapılandırılmıştır.

Render Hedeflerinin Pratik Kullanım Alanları Nelerdir?

Bu tam veya kapsamlı bir liste olmasa da, bir Render Hedefinin faydalı olacağı durumlara bazı örnekler şunlardır:

  • Bir araç için dikiz aynası.
  • Bir binanın güvenlik odasındaki bir TV'de gösterilen güvenlik kamerası yayını.
  • Oyuncuların üzerine çizim yapabileceği bir boyama tuvali.

Oyunun Ana Görünümü Bir Render Hedefidir

Render Hedeflerinin, oyunun render sisteminin temel bir parçası olduğunu anlamak önemlidir.
Oyunun ana görünümüne yapabileceğiniz herhangi bir çizim veya render işlemi, her ikisi de Render Hedefi olduğu için bir Render Hedefine de yapılabilir.

Source Engine ve dolayısıyla Garry's Mod, "çift tamponlu" (double buffered) bir render sistemi kullanır. Bu, oyunun iki Render Hedefi (bu amaçla kullanıldığında "Kare Tamponları" - Frame Buffers - olarak adlandırılır) oluşturduğu anlamına gelir. Bu Render Hedeflerinden biri "Ön" (Front) diğeri ise "Arka"dır (Back). Ön Render Hedefi, oyuncunun görmesi için ekrana çizilen şeydir. Bu sırada, oyunun bir sonraki karesi Arka Render Hedefine çizilir. Kare, Arka Render Hedefine tamamen çizildikten sonra, render sistemi Ön ve Arka Render Hedeflerini değiştirir ("Spinning" olarak adlandırılır) ve süreç yeniden başlar.

Örnek Kod

Örnek

Aşağıdaki örnek kod, temel bir Render Hedefinin nasıl kurulacağını, üzerine 2D ve 3D öğelerin nasıl çizileceğini ve ardından Render Hedefinin ekrana nasıl çizileceğini iyi bir şekilde göstermelidir.

-- Bu örnek boyunca kullanacağımız Render Hedefini oluştur local renderTarget = GetRenderTarget( "RenderTargetExample", -- Yeni Render Hedefinin Dokusuna vereceğimiz isim 1024, 1024 -- Render Hedefinin boyutu ) -- Az önce oluşturduğumuz Render Hedefi ile eşleşen bir Materyal oluştur local renderTargetMaterial = CreateMaterial( "RenderTargetExampleMaterial", -- Tüm Materyallerin bir isme ihtiyacı vardır "UnlitGeneric", -- Bu gölgelendirici (shader) ekrana çizim yapmak için harikadır, ancak modellerde kullanılamaz -- Bu materyali bir modelde kullanmak için "VertexLitGeneric" gölgelendiricisini kullanmak gerekir. { ["$basetexture"] = renderTarget:GetName(), -- Bu Materyal için Doku olarak Render Hedefimizi kullan ["$translucent"] = "1", -- Bu olmadan, Materyal tamamen opak olur ve herhangi bir yarı saydamlık gösterilmez } ) -- Daha sonra bazı 3D render işlemleri için kullanılacak local clientsideModel = ClientsideModel( "models/props_lab/huladoll.mdl", RENDERGROUP_OPAQUE ) clientsideModel:SetNoDraw( true ) -- Tamamen beyaz bir materyal oyunun içinde yerleşiktir local colorMaterial = Material( "color" ) -- Bu fonksiyon bize sadece 2D bir bağlam kullanarak çizecek bir şeyler verir -- Başka herhangi bir 2D çizim işlemiyle değiştirilebilir local function DrawSomething2D() surface.SetMaterial( colorMaterial ) surface.SetDrawColor( Color( 255, 0, 255, 200 ) ) surface.DrawTexturedRectRotated( ScrW()/2, ScrH()/2, 500, 500, ( CurTime() * 200 ) % 360 ) end -- DrawSomething2D ile aynı, ancak 3D içerikli local function DrawSomething3D() -- Modeli aydınlatma kurmadan daha parlak hale getirmek için render.SuppressEngineLighting( true ) -- Varsayılan olarak, bir Render Hedefine 3D render yapmak, Derinlik Tamponunu görüntünün alfa kanalına koyar. -- Bunun neden böyle olduğunu bilmiyorum, ancak bu fonksiyonla bu davranışı devre dışı bırakabiliriz. render.SetWriteDepthToDestAlpha( false ) render.Model( { model = "models/props_lab/huladoll.mdl", -- Bu matematiği görmezden gelebilirsiniz, sadece hula bebeğine küçük bir dans yaptırmak için pos = Vector( 20, -math.sin( CurTime() * 7.5 ) * 0.35, -3.5 ), angle = Angle( 0, 180 + math.sin( CurTime() * 7.5 ) * 7, math.sin( CurTime() * 7.5 ) * 15 ) }, clientsideModel ) render.SetWriteDepthToDestAlpha( true ) render.SuppressEngineLighting( false ) end -- Her karede çalışan bir hook içinde, Render Hedefine çizim yap -- Not: Bunun için herhangi bir hook kullanabilirsiniz. hook.Add( "PreDrawEffects", "DrawingToExampleRenderTarget", function() -- Render hedefimize çizim yapmaya başla render.PushRenderTarget( renderTarget ) -- Bir önceki karenin Render Hedefi içeriğini kaldırarak temiz bir "tuval" üzerine yenisini çizebiliriz render.Clear( 0, 255, 0, 200, true, true ) -- 2D bir bağlamda çizime başla -- Varsayılan olarak bu hook 3D bir bağlam sağlar, bu yüzden onu değiştirmemiz gerekiyor. cam.Start2D() -- Render Hedefine eğlenceli 2D içerikler çiz DrawSomething2D() cam.End2D() -- Hook'un orijinal 3D bağlamının bilinmeyen bir konumu ve dönüşü var. -- Render Hedefimiz üzerinde kontrol istediğimiz için yeni bir 3D bağlam başlatmamız gerekiyor. -- Bunu, birazdan render yapacağımız "kamerayı" kurmak gibi düşünebilirsiniz. cam.Start3D( Vector( 0, 0, 0 ), -- Bu 3D bağlamın görünümünün konumu Angle( 0, 0, 0 ), -- Bu 3D bağlamın görünümünün baktığı yön 40 -- Görüş alanı, derece cinsinden ) -- Artık 3D bir bağlamda olduğumuza göre, 3D bir şeyler çizelim DrawSomething3D() cam.End3D() -- Render hedefimize çizmeyi durdur ve render sisteminin normal şekilde devam etmesine izin ver render.PopRenderTarget() end ) -- Tamamen farklı bir hook içinde Render Hedefini Materyali aracılığıyla ekrana çizebiliriz -- Bu, Render Hedefinin kullanılabileceğini göstermek amacıyla tamamen farklı bir hook içinde yapılır -- çizildiği yerin dışında. hook.Add( "DrawOverlay", "DrawingRenderTargetToScreen", function() surface.SetMaterial( renderTargetMaterial ) surface.SetDrawColor( Color( 255, 255, 255, 255 ) ) surface.DrawTexturedRectRotated( 300, 300, 500, 500, 0 ) end )
Çıktı:

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord