I'm having problems with GLSL shaders--namely the fact that they're simply not doing anything.
Here's my code:
SuperStrict
Type NovaShader
'Vertex shader
Field VS:Int
'Fragment shader
Field FS:Int
'Shader program ID
Field ID:Int
'Begins the shader.
Method Bind()
glUseProgram(ID)
EndMethod
'Ends the shader.
Method UnBind()
glUseProgram(0)
EndMethod
'Loads a shader
Function Load:NovaShader(VSFileName:String, FSFileName:String)
Local S:NovaShader = New NovaShader
'Create shaders
S.VS = glCreateShader(GL_VERTEX_SHADER)
S.FS = glCreateShader(GL_FRAGMENT_SHADER)
Local VSFile:TStream = OpenFile(VSFileName)
Local VSSource:String = LoadText(VSFile)
VSFile.Close()
Local FSFile:TStream = OpenFile(FSFileName)
Local FSSource:String = LoadText(FSFile)
FSFile.Close()
Local VS_CStr:Byte Ptr = VSSource.ToCString()
Local FS_CStr:Byte Ptr = FSSource.ToCString()
glShaderSource(S.VS, 1, Varptr(VS_CStr), Null)
glShaderSource(S.FS, 1, Varptr(FS_CStr), Null)
MemFree(VS_CStr)
MemFree(FS_CStr)
glCompileShader(S.VS)
glCompileShader(S.FS)
S.ID = glCreateProgram()
glAttachShader(S.ID, S.VS)
glAttachShader(S.ID, S.FS)
glLinkProgram(S.ID)
Return S
EndFunction
EndType
Function NovaStart(DisplayWidth:Int = 640, DisplayHeight:Int = 480, IsFullscreen:Int = 0)
GLGraphics(DisplayWidth, DisplayHeight, IsFullscreen)
glEnable(GL_TEXTURE_2D)
'glEnable(GL_LIGHTING)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glMatrixMode(GL_PROJECTION)
gluPerspective(45.0, 1024.0 / 768.0, 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glClearColor(0.0, 0.4, 0.6, 1.0)
glClearDepth(1.0)
glewInit()
EndFunction
NovaStart(1024, 768, 0)
glTranslatef(-1.5, 0.0, -6.5)
Local Vertices:Float[] = [-1.0, -1.0, 0.0, -1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, -1.0, 0.0]
Local VB:Int
glGenBuffers(1, Varptr(VB))
glBindBuffer(GL_ARRAY_BUFFER, VB)
glBufferData(GL_ARRAY_BUFFER, SizeOf(Vertices), Vertices, GL_STATIC_DRAW)
Local Shader:NovaShader = NovaShader.Load("vertshader.vert", "fragshader.frag")
Repeat
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glRotatef(1.0, 0.0, 1.0, 0.0)
Shader.Bind()
glEnableClientState(GL_VERTEX_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER, VB)
glVertexPointer(3, GL_FLOAT, 0, Null)
glDrawArrays(GL_QUADS, 0, 4)
glDisableClientState(GL_VERTEX_ARRAY)
Shader.UnBind()
Flip
Until AppTerminate() Or KeyHit(KEY_ESCAPE)
Vertshader.vert:
void main(void)
{
vec4 a = gl_Vertex;
a.x = a.x * 0.5;
a.y = a.y * 0.5;
a.z = a.z * 0.5;
gl_Position = gl_ModelViewProjectionMatrix * a;
}
Fragshader.frag:
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
If all goes well the shaders should shrink the square to half-size and color it red. Unfortunately, they're not doing anything. All I get is a rotating white square, which is exactly what I get without the shaders.
Any ideas as to where I'm going wrong?
EDIT:
I've fixed it, I was passing the strings incorrectly.
|