I’m using the image from a second camera as a texture.

To compensate for affine mapping (like this):

I’ve added the following line to the render shader:

` gl_Position /= gl_Position.w;`

which “works” giving this:

**but** the texture disappears and I get this visual artifact when the texture is almost outside the camera’s view

instead of this

Anyone have any idea what’s happening and how to fix it (I’m all out of ideas)?

TIA

For completeness:

**Vertex shader:**

```
attribute vec3 aPosition;
attribute vec2 aCorners;
attribute vec2 aUv0;
uniform mat4 matrix_model;
uniform mat4 matrix_viewProjection;
varying vec2 vCorners;
varying vec2 vUv0;
uniform float height;
uniform float width;
void main(void) {
vUv0 = aUv0 / vec2(width, height);
vCorners = aCorners;
gl_Position = matrix_viewProjection * matrix_model * vec4(aPosition, 1.0);
gl_Position /= gl_Position.w;
}
```

**Frag shader**

```
precision highp float;
uniform sampler2D uColorBuffer;
uniform float height;
uniform float width;
varying vec2 vUv0;
varying vec2 vCorners;
void main() {
vec2 UVs = vec2(vUv0.x, 1. - vUv0.y);
gl_FragColor = texture2D(uColorBuffer, UVs);
}
```

Hi @CarlBateman,

I haven’t done something similar before, but it may be the case when doing the perspective division by .w in the vertex shader, when some of the vertices are off screen are clipped incorrectly.

If it’s possible, store the `w`

component in a varying and do the division in the fragment shader?

```
vec2 affineUV = vUv0 / vClipW;
```

Hope it helps.

you can also try sampling your texture using texture2DProj

1 Like

@mvaligursky

Alas

`Failed to compile fragment shader:`

`ERROR: 0:16: 'texture2DProj' : no matching overloaded function found`

I strongly suspect the error is on the JavaScript side.

I calculate the on-screen co-ordinates like so:

```
let toWorldTransform = this.entity.getWorldTransform();
let pos = new pc.Vec3(positions[i], positions[i + 1], positions[i + 2]);
let worldPosition = toWorldTransform.transformPoint(pos);
let screenPosition = camera.worldToScreen(worldPosition);
```

But one pair of co-ordinates (the right-most) switch sign

**Correct**

```
-7280069.912593271, 3877427.9896068643
-7280069.912593273, -3678760.1932197637
231.346458528, 1078.7000162930
231.346458528, -79.3996963762
```

**Wrong**

```
10884949.03334061, -5795229.547305286
10884949.03334061, 5500072.461739768
231.09154364, 1078.829860845
231.09154364, -79.463184058
```

After **extensive** testing, the problem is definitely *not* on the JavaScript side.

So, yeah, not a clue what’s going on.