开发者

HLSL: Handle lack of TexCoords?

开发者 https://www.devze.com 2023-02-25 17:52 出处:网络
I\'m in the process of writing my first few shaders, usually writing a shader to accomplish features as I realize that the main XNA library doesn\'t support them.

I'm in the process of writing my first few shaders, usually writing a shader to accomplish features as I realize that the main XNA library doesn't support them.

The trouble I'm running into is that not all of my models in a particular scene have texture data in them, and I can't figure out how to handle that. The main XNA libraries seem to handle it by using a wrapper class for BasicEffect, loading it through the content manager and selectively enabling or disabling texture processing accordingly.

How difficult is it to accomplish this for a custom shader? What I'm writing is an generic "hue shift" effect, that is, I want whatever gets drawn with this technique to have its texture colors (if any) and its vertex color hue shifted by a certain degree. Do I need to write separate shaders, one with textures and one without? If so, when I'm looping through my MeshParts,开发者_运维百科 is there any way to detect if a given part has texture coordinates so that I can apply the correct effect?


Yes, you will need separate shaders, or rather different "techniques" - it can still be the same effect and use much of the same code. You can see how BasicEffect (at least the pre-XNA 4.0 version) does it by reading the source code.

To detect whether or not a model mesh part has texture coordinates, try this:

// Note: this allocates an array, so do it at load-time
var elements = meshPart.VertexBuffer.VertexDeclaration.GetVertexElements();
bool result = elements.Any(e => 
        e.VertexElementUsage == VertexElementUsage.TextureCoordinate);

The way the content pipeline sets up its BasicEffect is via BasicMaterialContent. The BasicEffect.TextureEnabled property is simply turned on if Texture is set.

0

精彩评论

暂无评论...
验证码 换一张
取 消