Problem with tile based texturing using shader (CG)

Started by
0 comments, last by whisp 11 years, 10 months ago
Hi!

I'm desperately trying to get a simple shader running. What i want is to texture a terrain page of 65 * 65 vertices with tiles from a textur atlas, using a second texture, the tile-map, to lookup the respective tile-type to use.

Shaders are new to me, so it's likely that i didn't understand some of the logic i'm using. Instead of the tiles looked up in the tile-map it just repeats the whole tile-atlas a few times over the terrain page.

In the following my shader code commented with what i think the respective lines should do. It should output the top left tile from the texture atlas, but instead it outputs, as mentioned earlier, the whole tile-atlas a few times over the page:

[source lang="cpp"]// Output structure
struct VP_Output
{
float4 wvpos : POSITION;
float2 texCoord : TEXCOORD0;
float4 pageVertXZ : COLOR;
};

// Vertex program
VP_Output TerrainVP(
float4 position : POSITION,
uniform float4x4 worldViewProj)
{
VP_Output OUT;

// World position
OUT.wvpos = mul(worldViewProj, position);

// Position relative to model (top left vertex xz in page is 0, 0)
OUT.pageVertXZ.xy = position.xz;

// Texture Coordinates, 1/8 of the tileset (tile set contains 8 * 8 tiles, 256 * 256 pixels)
// In the fragment shader the texture coordinates will be set to 0,0 + the automatic interpolation
OUT.texCoord = OUT.pageVertXZ.xy * 0.125;

return OUT;
}

// Output structure
struct FP_Output
{
float4 color : COLOR;
};

FP_Output TerrainFP(float2 texCoord : TEXCOORD0,
float4 pageVertXZ : COLOR,
uniform sampler2D lookupTex : TEXUNIT1,
uniform sampler2D decal : TEXUNIT0)
{
FP_Output OUT;

// set texCoord relative to 0,0
float2 tc2;
tc2.xy = texCoord - pageVertXZ.xy * 0.125;

// This should output the respective pixel color of the first tile (top left) from the atlas
OUT.color = tex2D(decal, tc2);
return OUT;
}[/source]

Any help is appreciated.

Thanks
whisp
Advertisement
I figured out a possible solution for the problem.

The data passed from a vertex program to a fragment program always gets interpolated. It's not possible to pass custom values that don't get interpolated, thus the interpolation needs to be removed in the fragment shader.

In this case i need the non-interpolated model-space-coordinates of the vertices in order to look up the tile-map texture.

In the vertex shader i calculated the texture coordinates:
// Texture Coordinates, 1/8 of the tileset
OUT.texCoord = OUT.pageVertXZ.xy * 0.125;

With this coordinates the vertex position can be calculated in the fragment shader:
// set texCoord relative to 0,0
float2 pageVertXZ = floor(indata.texCoord * 8);

The interpolation-value just gets cropped, what's left is the vertex coordinate in model space.

This topic is closed to new replies.

Advertisement