2011-10-01 40 views
11

Gần đây tôi đã tham gia lập trình HLSL và tôi rất tò mò về CÁCH một số điều tôi đang thực sự làm việc.Một số câu hỏi XNA/HLSL đơn giản

Ví dụ: tôi đã có trình đổ bóng rất đơn giản này ở đây tô màu bất kỳ pixel nào có màu teal thành màu đỏ-ish.

sampler2D mySampler; 

float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR 
{ 
    float4 Color; 
    Color = tex2D(mySampler, texCoords.xy); 

    if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0) 
    { 
     Color.r = 1.0; 
     Color.g = 0.5; 
     Color.b = 0.5; 
    } 
    return Color; 
} 

technique Simple 
{ 
    pass pass1 
    { 
     PixelShader = compile ps_2_0 MyPixelShader(); 
    } 
} 

Tôi hiểu rằng tex2D chức năng lấy màu của pixel tại vị trí quy định, nhưng những gì tôi không hiểu là như thế nào mySampler thậm chí còn có bất kỳ dữ liệu. Tôi không thiết lập nó hoặc đi qua trong một kết cấu ở tất cả, nhưng nó kỳ diệu chứa dữ liệu của kết cấu của tôi.

Ngoài ra, sự khác biệt giữa những thứ như là những gì: COLORCOLOR0 hoặc TEXCOORDTEXCOORD0

tôi có thể mất một đoán hợp lý và nói rằng COLOR0 là một registry trong lắp ráp chứa màu điểm ảnh đang được sử dụng trong GPU. (có thể hoàn toàn sai, tôi chỉ nói những gì tôi nghĩ là)

Và nếu vậy, điều đó có nghĩa là chỉ định một cái gì đó như float2 texCoords : TEXCOORD0 sẽ theo mặc định, lấy vị trí hiện tại mà GPU đang xử lý?

Trả lời

7

mySampler được kết hợp với thanh ghi mẫu, đầu tiên là S0.

SpriteBatch sử dụng cùng một thanh ghi để vẽ họa tiết, do đó bạn đã khởi tạo trước khi chắc chắn.

thanh ghi này có liên quan đến mảng GraphicDevice.Textures và GraphicDevice.SamplerStates.

Trong thực tế, trong shader của bạn, bạn có thể sử dụng câu này:

sampler TextureSampler : register(s0); 

EDIT:

nếu bạn cần phải sử dụng một kết cấu thứ hai trong shader của bạn, bạn có thể làm điều này:

HLSL 
     sampler MaskTexture : register(s1); 

C#: 
     GraphicsDevice.Textures[1] = MyMaskTexture; 
     GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode.... 

Color0 không phải là đăng ký và không giữ màu pixel hiện tại. Nó được gọi là cấu trúc đỉnh bạn đang sử dụng.

Khi bạn xác định đỉnh như VertexPositionColor, đỉnh chứa vị trí và màu, nhưng nếu bạn muốn xác định đỉnh tùy chỉnh có hai màu, bạn cần có cách phân biệt giữa hai màu ... kênh truyền hình.

Hậu tố số có nghĩa là kênh bạn đang tham chiếu trong đỉnh hiện tại.

+0

Mặc dù chính xác nó được gán cho mẫu trong sổ đăng ký ở đâu? Tôi đã không chỉ định đăng ký nó lấy mẫu từ vì vậy tôi đoán nó sẽ chỉ lấy s0 theo mặc định mà không có bất kỳ đặc điểm kỹ thuật mã? Ngoài ra, bạn sẽ đưa ra một câu hỏi khác: 'sampler' có hoạt động giống như' sampler2D' không? – inline

+0

bất kỳ thao tác vẽ nào bạn làm, sử dụng thanh ghi đó, nếu bạn đang sử dụng spritebatch hoặc hiệu ứng cơ bản trước đó với kết cấu đó, nó đã được thực hiện nội tại ... – Blau

+0

Ngọt. Cảm ơn bạn đã thanh toán bù trừ một số thứ cho tôi. :) – inline

Các vấn đề liên quan