Bir HLSL gölgelendirici gerçekte render çıktısını nasıl etkiler?


11

HLSL sözdizimini anlıyorum, örneğin bunu HLSL'im olarak görüyorum:

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = position;
    output.position.xy *= 0.7f;    // "shrink" the vertex on the x and y axes
    output.color = color;

    return output;
}


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}

ve ben şöyle derledim:

D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);

Nasıl ... nasıl değişeceğini biliyor ... HLSL ve ekrandaki gerçek pikseller / köşeler arasındaki boru hattının tam olarak ne olduğunu karıştırıyorum.

Onları gerçekten "uygulayan" bu mu?

dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);

// set the shader objects
devcon->VSSetShader(pVS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);

Unutmayın , bu şeylerde gerçek bir acemi gibiyim . Birisi ne yaptığını açıklayabilir mi? Köşe HLSL işlevinin her tepe noktasından geçtiğini ve sonra işlevde ne olursa olsun onları değiştirdiğini ve çıktıda ne değiştiğini varsayıyorum ... ve benzer şekilde piksel gölgelendirici için?

Başka bir karışıklık, bir pikselin ne olduğunu biliyorum ve bir tepe noktasının ne olduğunu anlıyorum ... ama piksel gölgelendirici tam olarak ne yapıyor?


Sorun yok, kimse yapmıyor
bobobobo

Yanıtlar:


10

Nasıl gibi ...... değiştirmeyi biliyor .... HLSL ve ekrandaki gerçek Pixels / Vertex arasındaki boru hattı tam olarak karıştı.

Bu kabaca şu şekilde çalışır: Bir beraberlik çağrısı (D3D'de DrawPrimitives, DrawIndexedPrimitives, 10+ içinde çiz, vb.), Boru hattına bağladığınız geometri verileri (tepe noktası tamponlarınız) işlenir. Her köşe için, köşe gölgelendirici klip alanında bir çıktı tepe noktası üretmek üzere yürütülür.

GPU, daha sonra kırpma / kaldırma ve tepe noktasını üçgenlere rasterleştirmeye başladığı ekran boşluğuna getirme gibi klips alanı tepe noktasında bazı sabit işlevler gerçekleştirir. Her üçgenin rasterleştirilmesi sırasında, GPU o üçgenin yüzeyi boyunca köşe özniteliklerini enterpolasyonlar, bu piksel için yarı nihai bir renk üretmek üzere enterpole edilmiş her özniteliği piksel gölgelendiriciye besler (piksel gölgelendirici yürütüldükten sonra karıştırma uygulanır, dolayısıyla "yarı- ) "nihai.

onları gerçekten "uygulayan" budur:

Gönderdiğiniz kod önce gölgelendiricileri derler, ardından bunları değiştirilene kadar sonraki çizim çağrıları için aktif kaldıkları boru hattına bağlar. Aslında idam edilmelerine neden olmaz.

Birisi belki ne yaptığını açıklayabilir mi, Vertex HLSL işlevinin her tepe noktasından geçtiğini varsayarak (Konum: POZİSYON ve renk: RENK girişinde) ve sonra bunları işlevde ne yaptığımla değiştirir ve çıktı değiştirilen şeydir. ... (Pixel Shader için de geçerlidir).

Başka bir karışıklık, bir pikselin ne olduğunu biliyorum ve bir tepe noktasının ne olduğunu anlıyorum ..... ama Pixel gölgelendiricisinin tam olarak ne yaptığı ......

Köşe gölgelendirici, köşeleri model alanından klip alanına dönüştürmekten sorumludur.

Piksel gölgelendirici, enterpolasyonlu tepe özelliklerine göre bir piksel için sondan bir önceki rengin / derinliğin hesaplanmasından sorumludur.


9

Çok fazla jargon kullanmadan işlerin nasıl çalıştığını açıklamaya çalışacağım.

Etkileşimli hızdan ziyade sadelik endişeniz varsa, bilgisayardaki 3B bir yüzey uzayda sadece büyük bir nokta bulutu olacaktır, yeterince yoğun olduğundan, aralarındaki boşluklar olmadan her noktayı ayrı ayrı oluşturabiliriz.

Bir modeli bellekte yalnızca bir kez saklamak istiyorsunuz, ancak çeşitli boyutlarda ve çeşitli açılardan görüntülemeniz gerekiyor, bu nedenle bir 3D modeli oluşturduğunuzda, tüm noktaları bellekten okurken "dönüştürmeniz" gerekir. Örneğin, modeli% 50 daha büyük hale getirmek için, noktaların konumlarını yarıya indirmeniz gerekir:

out.position = in.position * 0.5;
out.color = in.color;

Bu neredeyse düşünülebilecek en basit "tepe gölgelendirici" dir: İçinde bellekten bir tepe konumu gelir ve dışarıda yarı yarıya yeni bir tepe konumu gelir. Yarı büyük tepe noktası belleğe geri depolanmaz - derhal işleme için kullanılır ve sonra atılır.

Önemli kavramlardan yoksun bir kaba aşırı basitleştirme olsa da , bu ruhsal olarak filmlerin grafik yapma yönlerini açıklar.

Etkileşimli grafikler (oyunlar) bu kadar basit olamaz, çünkü grafikleri bir filmden birkaç kat daha büyük boyutta göstermeleri gerekir.

Oyunlarda, ekrandaki her piksel için bir nokta ve boşlukları kapsayacak ekstralar oluşturmayı göze alamayız. Bir uzlaşma olarak, yakındaki her üç nokta arasındaki boşluk, çeşitli teknik nedenlerle ekranda en az 10 piksel büyük olmasını tercih eden bir üçgen olarak oluşturulur.

Bir 3D üçgen 2D bir ekrana yansıtılabilir , daha sonra her biri 0D piksel yığınına bölünebilen 1D satır yığınına bölünebilir. Bu nedenle, bir 3D üçgeni oluşturma problemini, çok sayıda 0D pikseli izole etme konusunda daha basit bir probleme bölebilir ve fethedebiliriz. Bir bilgisayar daha basit sorunları daha kısa sürede çözebilir.

Bir piksel gölgelendirici, bir üçgenin sökülmesiyle oluşturulan her piksel üzerinde çalıştırdığımız küçük bir programdır.

out.color = in.color;

Bu neredeyse düşünülebilecek en basit "piksel gölgelendiricisidir": Üç üçgen köşenin renklerinin bir karışımı gider ve dışarıda aynı renk gider. Girişler "köşe gölgelendiricisinin" çıkışlarından gelir ve çıkışlar hafızadaki ekrana yazılır.

Yani - "köşe gölgelendirici" GPU çipinin içinde çalışan bir programdır. Girişi GPU belleğindeki bir "köşe tamponu" dur ve çıkışı doğrudan bir "piksel gölgelendiricisine" beslenir. "Piksel gölgelendirici" de GPU yongasının içinde çalışan bir programdır. Girdileri tepe gölgelendiricisinden üç köşenin bir karışımıdır ve çıktısı ekranda bir pikseldir.



-2

Şu anda bir piksel gölgelendirici için endişelenmeyin. Yeni başlayan biriyseniz, yalnızca köşe ve parça gölgelendiricileri ile GLSL / HLSL'nin merhaba dünyası olmalısınız. Bir kez bilindik ve değişken hareketleri anlamaya başladıktan sonra ufkunuzu genişletin.

API'nın nasıl çalıştığına dair cesur cesaret almak için bir ders kitabı tavsiye ederim. OpenGL kitapları ayrıca , sabit boru hattından dinamik programlanabilir boru hattına yıllar içinde işlerin nasıl değiştiğini gösteren iyi bir iş çıkarıyor .

Şampiyon ol!


1
Bir parça gölgelendirici, bir piksel gölgelendiriciyle aynı işlevi yerine getirir.

1
OP'nin tüm oyun programlarında yeni başlayan olup olmadığını söyleyebileceğimizi sanmıyorum - sadece gölgelendirici kodu yazmaya yeni başlayan biri olduğunu belirtti. Gölgelendiriciler yazmayı öğrenmek, bir oyun geliştiricisinin kulübesinde olması için çok önemli bir araçtır, sadece oyun geliştirmeyi öğrenmenin en başlangıç ​​aşamalarında olmadıkça, sadece onları parlatmam .
Olhovsky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.