这次我有这个由三角形组成的立方体。我的代码为每个三角形分配纹理。如何更改代码,这样只有一面墙会被留下作为纹理而另一面会被涂成黄色?
public class Game1 : Microsoft.Xna.Framework.Game
{
private float angle = .9f;
private float SecondAngle = -1f;
//MyVertexFormat struct to go here
struct MyVertexFormat
{
private Vector3 position;
private Vector2 texCoord;
public MyVertexFormat(Vector3 position, Vector2 texCoord)
{
this.position = position;
this.texCoord = texCoord;
}
//Add VertexDeclaration here
public readonly static VertexDeclaration VertexDeclaration = new
VertexDeclaration(
new VertexElement(0, VertexElementFormat.Vector3,
VertexElementUsage.Position, 0),
new VertexElement(sizeof(float) * 3,
VertexElementFormat.Vector2,
VertexElementUsage.TextureCoordinate, 0));
}
GraphicsDeviceManager graphics;
GraphicsDevice device;
Effect effect;
Matrix viewMatrix;
Matrix projectionMatrix;
VertexBuffer vertexBuffer;
Vector3 cameraPos;
Texture2D wallTexture;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
graphics.PreferredBackBufferWidth = 500;
graphics.PreferredBackBufferHeight = 500;
graphics.IsFullScreen = false;
graphics.ApplyChanges();
Window.Title = "HLSL Start";
base.Initialize();
}
protected override void LoadContent()
{
device = GraphicsDevice;
wallTexture = Content.Load<Texture2D>("wall");
effect = Content.Load<Effect>("Effect1");
SetUpVertices();
SetUpCamera();
}
private void SetUpVertices()
{
MyVertexFormat[] vertices = new MyVertexFormat[36];
//Back
vertices[0] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(1.0f, 0.0f));
vertices[1] = new MyVertexFormat(new Vector3(1, 1, -1),
new Vector2(0.0f, 1.0f));
vertices[2] = new MyVertexFormat(new Vector3(-1, 1, -1),
new Vector2(1.0f, 1.0f));
vertices[3] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(1.0f, 0.0f));
vertices[4] = new MyVertexFormat(new Vector3(1, -1, -1),
new Vector2(0.0f, 0.0f));
vertices[5] = new MyVertexFormat(new Vector3(1, 1, -1),
new Vector2(0.0f, 1.0f));
//Bottom
vertices[6] = new MyVertexFormat(new Vector3(1, -1, 1),
new Vector2(1.0f, 1.0f));
vertices[7] = new MyVertexFormat(new Vector3(1, -1, -1),
new Vector2(1.0f, 0.0f));
vertices[8] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(0.0f, 0.0f));
vertices[9] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(0.0f, 0.0f));
vertices[10] = new MyVertexFormat(new Vector3(-1, -1, 1),
new Vector2(0.0f, 1.0f));
vertices[11] = new MyVertexFormat(new Vector3(1, -1, 1),
new Vector2(1.0f, 1.0f));
//Top
vertices[12] = new MyVertexFormat(new Vector3(-1, 1, 1),
new Vector2(0.0f, 1.0f));
vertices[13] = new MyVertexFormat(new Vector3(-1, 1, -1),
new Vector2(1.0f, 1.0f));
vertices[14] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(0.0f, 0.0f));
vertices[15] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(0.0f, 0.0f));
vertices[16] = new MyVertexFormat(new Vector3(-1, 1, -1),
new Vector2(1.0f, 1.0f));
vertices[17] = new MyVertexFormat(new Vector3(1, 1, -1),
new Vector2(1.0f, 0.0f));
//Right side
vertices[18] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(1.0f, 1.0f));
vertices[19] = new MyVertexFormat(new Vector3(1, -1, -1),
new Vector2(0.0f, 0.0f));
vertices[20] = new MyVertexFormat(new Vector3(1, -1, 1),
new Vector2(1.0f, 0.0f));
vertices[21] = new MyVertexFormat(new Vector3(1, -1, -1),
new Vector2(0.0f, 0.0f));
vertices[22] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(1.0f, 1.0f));
vertices[23] = new MyVertexFormat(new Vector3(1, 1, -1),
new Vector2(0.0f, 1.0f));
//Left side
vertices[24] = new MyVertexFormat(new Vector3(-1, -1, 1),
new Vector2(0.0f, 0.0f));
vertices[25] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(1.0f, 0.0f));
vertices[26] = new MyVertexFormat(new Vector3(-1, 1, 1),
new Vector2(0.0f, 1.0f));
vertices[29] = new MyVertexFormat(new Vector3(-1, 1, 1),
new Vector2(0.0f, 1.0f));
vertices[28] = new MyVertexFormat(new Vector3(-1, 1, -1),
new Vector2(1.0f, 1.0f));
vertices[27] = new MyVertexFormat(new Vector3(-1, -1, -1),
new Vector2(1.0f, 0.0f));
//Front
vertices[30] = new MyVertexFormat(new Vector3(-1, 1, 1),
new Vector2(1.0f, 1.0f));
vertices[31] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(0.0f, 1.0f));
vertices[32] = new MyVertexFormat(new Vector3(-1, -1, 1),
new Vector2(1.0f, 0.0f));
vertices[33] = new MyVertexFormat(new Vector3(1, -1, 1),
new Vector2(0.0f, 0.0f));
vertices[34] = new MyVertexFormat(new Vector3(-1, -1, 1),
new Vector2(1.0f, 0.0f));
vertices[35] = new MyVertexFormat(new Vector3(1, 1, 1),
new Vector2(0.0f, 1.0f));
vertexBuffer = new VertexBuffer(device,
MyVertexFormat.VertexDeclaration, vertices.Length,
BufferUsage.WriteOnly);
vertexBuffer.SetData(vertices);
}
private void SetUpCamera()
{
cameraPos = new Vector3(0, 5, 6);
viewMatrix = Matrix.CreateLookAt(cameraPos, new Vector3(0, 0, 1), new Vector3(0, 1, 0));
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 200.0f);
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
viewMatrix = Matrix.CreateRotationY(MathHelper.ToRadians(angle)) *
Matrix.CreateRotationX(MathHelper.ToRadians(SecondAngle)) *
viewMatrix;
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.DarkSlateBlue, 1.0f, 0);
effect.CurrentTechnique = effect.Techniques["Shaded"];
effect.Parameters["View"].SetValue(viewMatrix);
effect.Parameters["Projection"].SetValue(projectionMatrix);
effect.Parameters["World"].SetValue(Matrix.Identity);
effect.Parameters["myTexture"].SetValue(wallTexture);
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
device.SetVertexBuffer(vertexBuffer);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 12);
}
base.Draw(gameTime);
}
}
}
效果文件:
float4x4 World;
float4x4 View;
float4x4 Projection;
Texture myTexture;
sampler TextureSampler = sampler_state {
texture = <myTexture>;
MinFilter = Anisotropic; // Minification Filter
MagFilter = Anisotropic; // Magnification Filter
MipFilter = Linear; // Mip-mapping
AddressU = Wrap; // Address Mode for U Coordinates
AddressV = Wrap; // Address Mode for V Coordinates
};
struct VertexShaderInput
{
float4 Position : POSITION0;
float2 UV: TEXCOORD0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float2 UV: TEXCOORD0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
output.UV = input.UV;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float3 output = float3(1, 1, 1);
output *= tex2D(TextureSampler, input.UV);
return float4(output, 1);
}
technique Shaded
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
任何人都知道吗?
答案 0 :(得分:0)
将黄色添加到纹理的一个小区域,并设置要成为黄色的三角形的(U,V)纹理坐标以映射该区域。
<强> [编辑] 强>
将颜色通道添加到顶点格式struct:
<强>类强>
struct MyVertexFormat
{
private Vector3 position;
private Vector2 texCoord;
private Color color;
public MyVertexFormat(Vector3 position, Vector2 texCoord, Color color)
{
this.position = position;
this.texCoord = texCoord;
this.color = color;
}
//Add VertexDeclaration here
public readonly static VertexDeclaration VertexDeclaration =
new VertexDeclaration(
new VertexElement(0, VertexElementFormat.Vector3,
VertexElementUsage.Position, 0),
new VertexElement(sizeof(float) * 3,
VertexElementFormat.Vector2,
VertexElementUsage.TextureCoordinate, 0)),
new VertexElement(sizeof(float) * 7,
VertexElementFormat.Color,
VertexElementUsage.Color, 0));
}
<强>效果强>
struct VertexShaderInput
{
float4 Position : POSITION0;
float2 UV: TEXCOORD0;
float4 Color: Color0;
};
作为一个注释,我认为最好从IVertexType继承你的顶点结构。