Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
# NOP Vertex shader
my $VertexProg = qq
{!!ARBvp1.0
PARAM center = program.local[0];
PARAM xform[4] = {program.local[1..4]};
TEMP vertexClip;
# ModelView projection
DP4 vertexClip.x, state.matrix.mvp.row[0], vertex.position;
DP4 vertexClip.y, state.matrix.mvp.row[1], vertex.position;
DP4 vertexClip.z, state.matrix.mvp.row[2], vertex.position;
DP4 vertexClip.w, state.matrix.mvp.row[3], vertex.position;
# Additional transform, via matrix variable
DP4 vertexClip.x, vertexClip, xform[0];
DP4 vertexClip.y, vertexClip, xform[1];
DP4 vertexClip.z, vertexClip, xform[2];
DP4 vertexClip.w, vertexClip, xform[3];
#SUB result.position, vertexClip, center;
MOV result.position, vertexClip;
# Pass through color
MOV result.color, vertex.color;
# Pass through texcoords
SUB result.texcoord[0], vertex.texcoord, center;
END
};
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, $VertexProgID);
glProgramStringARB_p(GL_VERTEX_PROGRAM_ARB, $VertexProg);
if (DO_TESTS)
{
my $format = glGetProgramivARB_p(GL_VERTEX_PROGRAM_ARB,
GL_PROGRAM_FORMAT_ARB);
printf("glGetProgramivARB_p format: '#%04X'\n",$format);
my @params = glGetProgramEnvParameterdvARB_p(GL_VERTEX_PROGRAM_ARB,0);
my $params = join(', ',@params);
print "glGetProgramEnvParameterdvARB_p: $params\n";
@params = glGetProgramEnvParameterfvARB_p(GL_VERTEX_PROGRAM_ARB,0);
$params = join(', ',@params);
print "glGetProgramEnvParameterfvARB_p: $params\n";
my $vprog = glGetProgramStringARB_p(GL_VERTEX_PROGRAM_ARB);
print "Vertex Prog: $vprog\n";
}
# Lazy Metalic Fragment shader
my $FragProg = qq
{!!ARBfp1.0
PARAM surfacecolor = program.local[5];
TEMP color;
MUL color, fragment.texcoord[0].y, 2.0;
ADD color, 1.0, -color;
ABS color, color;
ADD color, 1.01, -color; #Some cards have a rounding error
MOV color.a, 1.0;
MUL color, color, surfacecolor;
MOV result.color, color;
END
};
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, $FragProgID);
glProgramStringARB_p(GL_FRAGMENT_PROGRAM_ARB, $FragProg);
if (DO_TESTS)
{
my $fprog = glGetProgramStringARB_p(GL_FRAGMENT_PROGRAM_ARB);
print "Fragment Prog: $fprog\n";
}
}
}
# ------
# Routine which actually does the drawing
sub cbRenderScene
{
# Quit if inactive
my $time = $hasHires ? gettimeofday() : time();
my $time_to_exit = $idleSecsMax - ($time-$idleTime);
if ($time_to_exit <= 0 )
{
print "Idle timeout; completing test\n";
ourCleanup();
return quit("render callback");
}
my $buf; # For our strings.
# Animated Texture Rendering
if ($FBO_On && ($FBO_On == 2 || !$FBO_rendered))
{
$FBO_rendered = 1;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, $FrameBufferID);
glPushMatrix();
glTranslatef(-0.35, -0.48, -1.5);
glRotatef($Teapot_Rot--, 0.0, 1.0, 0.0);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushAttrib(GL_ENABLE_BIT);
glEnable(GL_DEPTH_TEST);
# Run shader programs for texture.
# If installed, use OpenGL::Shader
if ($Shader)
{
$Shader->Enable();
$Shader->SetVector('center',0.0,0.0,2.0,0.0);
$Shader->SetMatrix('xform',$xform);
$Shader->SetVector('surfacecolor',1.0,0.5,0.0,1.0);
}
# Otherwise, do it manually
elsif ($hasFragProg)
( run in 1.103 second using v1.01-cache-2.11-cpan-39bf76dae61 )