Imposter Sphere


I’ve been following the tutorial on

Chapter 13 is about drawing imposter spheres. Basically you render a sqare and perform this in the fragment shader:

#version 330

//in vec3 vertexNormal;
in vec3 modelSpacePosition;
in vec3 modelSpaceLightPos;
//in vec3 lightIntens;

out vec4 outputColor;

//uniform vec3 modelSpaceLightPos;

void Impostor(out vec3 cameraPos, out vec3 cameraNormal)
    vec2 mapping = vec2(modelSpacePosition);
    float lensqr = dot(mapping, mapping);
    if(lensqr > 1.0)

    cameraNormal = vec3(mapping, sqrt(1.0 - lensqr));
    //cameraPos = (cameraNormal * sphereRadius) + cameraSpherePos;
    cameraPos = (cameraNormal * 1.0f) + modelSpaceLightPos;

void main(void)
    vec3 cameraPos ; vec3 cameraNormal;
    Impostor(cameraPos, cameraNormal);

    vec3 lightDir = normalize(modelSpaceLightPos - modelSpacePosition);

    float cosAngIncidence = dot(lightDir, normalize(cameraNormal));
    cosAngIncidence = clamp(cosAngIncidence, 0, 1);

    outputColor = vec4((cosAngIncidence * vec3(0.8f) + vec3(0.2f)), 1.0f);

I’ve gotten this to work with my own code but I want to know if the best course of action to creating 3d sphere in world space (rotate the camera around arbitrarily) is to have the sphere always facing you; doom model style (face the sphere to the camera on every iteration of display) or is there a better way?

Thanks in advance. I’d post pics if the new register limit wasn’t in effect.

Imposters are best used for objects that will render to a small number pixels on the screen. This can be because the objects are inherently small or are a long way from the camera.