Billboard vẽ tốt trên PC, không phải trên XBOX


8

Mặt trăng được vẽ bằng hai lệnh rút thăm, nhưng cả hai đều vẽ sai trên xbox vì vậy tôi chỉ hiển thị một lần vẽ cho đơn giản.


Đây là cách mặt trăng nên nhìn trên PC:

nhập mô tả hình ảnh ở đây

Nó trông như thế nào trên XBOX:

nhập mô tả hình ảnh ở đây

Các họa tiết nhấp nháy, biến mất, trông giống như một dải màu từ dưới lên trên, các đường chạy qua nó, và cứ thế khi máy ảnh di chuyển xung quanh. Ví dụ: sau khi di chuyển máy ảnh một chút, nó trông như thế này: http://olhovsky.com/xna/xbox_moon2.png

public void Draw(Camera cam) 
{ 
    GraphicsDevice gd = Game3.GDM.GraphicsDevice; 

    Vector3 position = Position + cam.Position; 
    Matrix world = Matrix.CreateScale(2.0f); 
    world *= Matrix.CreateConstrainedBillboard( 
    position, cam.Position, Vector3.Down, cam.Forward, null); 

    _moonEffect2.Parameters["World"].SetValue(world); 
    _moonEffect2.Parameters["View"].SetValue(cam.View); 
    _moonEffect2.Parameters["Projection"].SetValue(cam.Projection); 

    // Draw blended part of moon only. 
    _moonEffect2.Parameters["AlphaTestDirection"].SetValue(-1); 
    gd.BlendState = BlendState.AlphaBlend; 
    gd.RasterizerState = RasterizerState.CullNone; 
    gd.DepthStencilState = DepthStencilState.DepthRead; 
    ScreenQuadDraw.DrawQuad(_moonQuad, _moonEffect2); 
} 

Đây là shader được sử dụng, không có gì phức tạp ở đây: http://www.olhovsky.com/xna/Moon.fx

Có ai biết tại sao kết cấu không được hiển thị đúng trên xbox không? Có một trạng thái khác tôi nên được thiết lập có lẽ?


Trừ khi bạn đang làm điều đó trong DrawQuad, nếu không bạn sẽ thiết lập kết cấu cho mặt trăng một cách rõ ràng.
r2d2rigo

@ r2d2rigo: Nó được đặt một lần tại thời điểm tải trên hiệu ứng nhân bản "_moonEffect2" và sau đó không bao giờ được đặt lại, vì điều đó hiệu quả hơn.
Olhovsky

Câu trả lời:


4

Giải pháp là loại bỏ đầu vào màu không sử dụng khỏi shader.

Trình tạo pixel cũ:

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0, float4 color : COLOR0) : COLOR0
{
    color = tex2D(TextureSampler, texCoord);

    // Apply the alpha test.
    clip((color.a - AlphaTestThreshold) * AlphaTestDirection);

    return color;
}

Trình tạo pixel mới:

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 color = tex2D(TextureSampler, texCoord);

    // Apply the alpha test.
    clip((color.a - AlphaTestThreshold) * AlphaTestDirection);

    return color;
}

Có ai biết vì sao lại thế này không?
Jonathan Connell

Trên xbox 360, không ràng buộc bất cứ điều gì với đầu vào màu có lẽ giống như có một con trỏ tới một giá trị chưa được khởi tạo. Sau đó, bạn có thể có các giá trị ngẫu nhiên thay vì giá trị mặc định (không), đó là trường hợp trên windows. Trên thực tế, nó có thể không phải là tất cả các GPU Windows có hành vi đó. Có thể một số GPU Windows cũng thể hiện hành vi xbox. Dù sao, dù sao đi nữa, bạn không muốn có đầu vào không sử dụng, vì lý do hiệu suất, vì vậy nó không quá tệ.
Olhovsky

Đã đồng ý. Chỉ có hình ảnh đầu ra có vẻ kỳ lạ đối với tôi, vì bạn không sử dụng thuộc tính màu trong trình đổ bóng thực tế. Có thể đầu ra tiếp giáp sau đầu vào, và do đó, "màu" không bị ràng buộc sẽ ghi đè lên màu ouput? Tôi không biết: p
Jonathan Connell

Bây giờ tôi nhìn kỹ hơn vào shader của mình, lời giải thích của tôi không có ý nghĩa gì. Các colorgiá trị được thiết lập từ một kết cấu trước khi nó được sử dụng một trong hai cách, vì vậy giá trị ban đầu của colornên không quan trọng. Tôi không biết tại sao điều này xảy ra. Mặc dù vậy, đạo đức là không có đầu vào không sử dụng cho chức năng đổ bóng của bạn.
Olhovsky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.