Code archives/3D Graphics - Misc/openGL vertex/fragment program
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Loads and executes simple fp1.0/vp1.0 shader programs in OpenGL. They should be compatible with INTEL G41 chips. Commands can be found here: http://www.renderguild.com/gpuguide.pdf Quite convenient once you know how to read the table. As a reference, I saved this one as well: http://www.opengl.org/registry/specs/NV/fragment_program.txt http://www.opengl.org/registry/specs/NV/vertex_program.txt It shows in code examples what the opcodes do internally. | |||||
SuperStrict
Global llen% = 0
SetGraphicsDriver GLGraphicsDriver()
GLGraphics 800,600,0,0,GRAPHICS_BACKBUFFER|GRAPHICS_DEPTHBUFFER
Global g_pixelProgramID%
Global g_vertexProgramID%
Global time#
'array to hold two triangles that form a square
Global g_triVertices:Float[] = ..
[..
0.0,0.0, 0.0,0.0,-1.0, -1.0,-1.0, -4.0 ,..
1.0,0.0, 0.0,0.0,-1.0, 1.0,-1.0, -4.0 ,..
1.0,1.0, 0.0,0.0,-1.0, 1.0, 1.0, -4.0 ,..
..
0.0,0.0, 0.0,0.0,-1.0, -1.0,-1.0, -4.0 ,..
1.0,1.0, 0.0,0.0,-1.0, 1.0, 1.0, -4.0 ,..
0.0,1.0, 0.0,0.0,-1.0, -1.0, 1.0, -4.0..
]
init() 'setup OPENGL
initShader() 'load and compile shaders
Repeat
render() 'render square with shaders
Until KeyHit(27) 'ESC=exit
End
'
' init() - Setup OPENGL
'
Function init()
glewInit()
glEnable( GL_DEPTH_TEST ) 'enable z-buffer
glEnable(GL_CULL_FACE) 'enable cull
glCullFace(GL_BACK) 'set cullmode
glClearColor( 0.85, 0.7, 0.5, 1.0 ) 'cameraclscolor
glMatrixMode( GL_PROJECTION ) 'choose projection matrix
glLoadIdentity() 'reset it
gluPerspective( 45.0, 640.0 / 480.0, 0.1, 100.0 ) 'create camera view
End Function
'
' Load and compile shader
'
Function initShader()
'
' Check capabilities
'
Local Extensions$ = String.FromCString(Byte Ptr(glGetString(GL_EXTENSIONS)))
Local VPSupport% = Extensions.Find("GL_ARB_vertex_program") > -1
Local FPSupport% = Extensions.Find("GL_ARB_fragment_program") > -1
If Not(VPSupport)
Print "No Vertex Program support."
End
End If
If Not(FPSupport)
Print "No Fragment Program support."
End
End If
'
' Create the vertex program...
'
glGenProgramsARB( 1, Varptr g_vertexProgramID )
glBindProgramARB( GL_VERTEX_PROGRAM_ARB, g_vertexProgramID )
Local shader_assembly$ = readShaderData() 'read from data (DefData) below
glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, Len(shader_assembly), shader_assembly.ToCString() )
If ( glGetError() <> GL_NO_ERROR )
Print "ERROR in vert.shad."
End
End If
'
' Create the fragment program...
'
' Create the vertex program
glGenProgramsARB( 1, Varptr g_pixelProgramID )
glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, g_pixelProgramID )
shader_assembly = readShaderData() 'read shader from data (DEFDATA) below
glProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, Len(shader_assembly), shader_assembly.ToCString() )
If ( glGetError() <> GL_NO_ERROR )
Print "ERROR in pix.shad."
End
End If
End Function
'
' readShaderData() - read shader from data (DEFDATA) below
'
Function readShaderData$()
Local out$
Repeat
Local l$
ReadData l$
If l$ = "---" Exit
out$ = out$ + l$ + "~r~n"
Forever
Return out$
End Function
'
' render() - render a square using shaders
'
Function Render()
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
glEnable( GL_VERTEX_PROGRAM_ARB ) 'enable shaders
glBindProgramARB( GL_VERTEX_PROGRAM_ARB, g_vertexProgramID )
glEnable( GL_FRAGMENT_PROGRAM_ARB )
glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, g_pixelProgramID )
time :+ 0.001 'counter (global)
Local ff#[] = New Float[4] 'create array
ff[0] = time 'insert into first value of array
ff[1] = 0
ff[2] = 0
ff[3] = 0
glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,0,ff) 'pass (4-float) array to fragment shader (/program)
glInterleavedArrays( GL_T2F_N3F_V3F, 0, g_triVertices ) 'set triangle array
glDrawArrays( GL_TRIANGLES, 0, g_triVertices.length/8 ) 'draw triangle array
glDisable( GL_FRAGMENT_PROGRAM_ARB ) 'disable shaders
glDisable( GL_VERTEX_PROGRAM_ARB )
Flip
End Function
#ShaderData
DefData "!!ARBvp1.0" 'calculation pro vertex
DefData ""
DefData "# Constant Parameters"
DefData "PARAM mvp[4] = { state.matrix.mvp }; # Model-view-projection matrix" 'read default openGL renderview matrix
DefData ""
DefData "# Per-vertex inputs"
DefData "ATTRIB inPosition = vertex.position;" 'read position
DefData "ATTRIB inColor = vertex.color;" 'read color
DefData "ATTRIB inTexCoord = vertex.texcoord;" 'read uv coordinate
DefData ""
DefData "# Per-vertex outputs"
DefData "OUTPUT outPosition = result.position;" 'set output xyz
DefData "OUTPUT outColor = result.color;" 'set output color
DefData "OUTPUT outTexCoord = result.texcoord;" 'set output uv
DefData ""
DefData "DP4 outPosition.x, mvp[0], inPosition; # Transform the x component of the per-vertex position into clip-space"
DefData "DP4 outPosition.y, mvp[1], inPosition; # Transform the y component of the per-vertex position into clip-space"
DefData "DP4 outPosition.z, mvp[2], inPosition; # Transform the z component of the per-vertex position into clip-space"
DefData "DP4 outPosition.w, mvp[3], inPosition; # Transform the w component of the per-vertex position into clip-space"
DefData ""
DefData "MOV outColor, inColor; # Pass the color through unmodified"
DefData "MOV outTexCoord, inTexCoord; # Pass the texcoords through unmodified"
DefData ""
DefData "END"
DefData "---"
DefData "!!ARBfp1.0" 'calculation pro pixel/fragment
DefData "PARAM c = program.local[0];" 'Data passed from line 125 (array Local ff#)
DefData "TEMP colorX;" 'internal variable
DefData ""
DefData "MOV colorX, fragment.texcoord[0].x;" 'read u-coordinate into colorX
DefData "ADD colorX, colorX, fragment.texcoord[0].y;" 'add v-coordinate to colorX
DefData "ADD colorX, colorX, c.x;" 'add input from main program (time counter from BMX code)
DefData "MUL colorX, colorX, 25.0;" 'multiply by 25
DefData "FRC colorX, colorX;" 'leave only fractional part (x MOD 1)
DefData "MUL colorX, colorX, 2.0;" 'multiply by two
DefData "FLR colorX, colorX;" 'leave only integer part (x = floor(x))
DefData ""
DefData "MOV result.color, colorX;" 'move colorX into result color (rgba)
DefData ""
DefData "MOV result.color.a, 1;" ' set alpha to 1.0
DefData ""
DefData "END"
DefData "---" |
Comments
| ||
| I like that the shader is DefData'd into the code, and that you are using ARB commands, which I should tell you that ARB Shaders work on INTEL G41 chips. NOTE: your above code needed a slight tweak to work for me: Function readShaderData$() Local out$ Repeat Local l$ ReadData l$ If l$ = "---" Exit out$ = out$ + l$ + "~r~n" Forever Return out$ End Function Furthermore, you can get better error descriptions by adding this to the two error calls: Local error_out:String = String.FromCString(glGetString(GL_PROGRAM_ERROR_STRING_ARB)) Print( error_out ) |
| ||
| I see, thanks. Updated. |
Code Archives Forum