glsl 'problem'
BlitzMax Forums/OpenGL Module/glsl 'problem'
| ||
| I'm just starting glsl(From cg, so not madly different, but different enough) and basically I'm not sure why but i can't access anything other than the first binded texture. this code below generates a vertex/pixel shader based on spec,
'ShaderGEN V0.1
'
'A system designed to generate shaders to replicate
'gl's fixed function functionality.
Type ShaderGen
Method NewShader(name:String)
Local vertFile:String = name+"Vert.glsl"
Local pixFile:String = name+"Pix.glsl"
vfile=WriteFile(vertfile)
pfile=WriteFile(pixfile)
useLights=0
End Method
Method GenLights()
useLights=True
End Method
Method addTexture( blendMode )
texblend[texnum]=blendmode
texnum:+1
useTextures=1
End Method
Method genPPLights()
useppLights=True
End Method
Method Generate()
If useTextures
For Local j=1 To TexNum
WriteLine vfile,"varying vec2 texCoord"+j+";"
Next
EndIf
writeHeader(vfile)
writeVertexTForm()
If useTextures
For Local j=1 To texNum
WriteLine vfile,"texCoord"+j+"= vec2(gl_MultiTexCoord"+(j-1)+");"
Next
EndIf
writeEnd(vfile)
Local pixOut:String = "gl_FragColor = "
If useTextures
For Local j=1 To TexNum
WriteLine pfile,"varying vec2 texCoord"+j+";"
WriteLine pfile,"uniform sampler2D cTexture"+j+";"
If j>1
Select texblend[j-1]
Case T_Normal
pixOut="gl_FragColor = "
Case T_ADD
pixOut=pixOut+"+"
Case T_Modulated
pixOut=pixOut+"*"
Case T_Subtract
pixOut=pixOut+"-"
Default
Throw "Undefined texture blending mode."
End Select
EndIf
pixOut=pixOut+"texture2D(cTexture"+j+",texCoord"+J+")"
Next
pixOut=pixOut+";"
EndIf
writeHeader(pfile)
WriteLine pfile,pixout
writeend(pfile)
CloseFile vfile
CloseFile pfile
End Method
Method writeVertexTForm()
WriteLine vfile,"gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
End Method
Method writeHeader(file)
WriteLine file,"void main()"
WriteLine file,"{"
End Method
Method writeEnd(file)
WriteLine file,"}"
End Method
Field useLights,useTextures
Field usePPLights,texNum
Field vfile,pfile
Field texBlend:Int[32]
Field dred!,dgreen!,dblue!
Field sred!,sgreen!,sblue!
End Type
vert shader it outputed
void main()
{
gl_position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
varying vec2 texCoord1;
uniform sampler2D cTexture1;
varying vec2 texCoord2;
uniform sampler2D cTexture2;
void main()
{
gl_FragColor = texture2D(cTexture1,texCoord1)+texture2D(cTexture2,texCoord2);
}
only texture 2 appears to be texture 1 still.. is there a way to access texture handles through glstate in glsl? |
| ||
| Good luck, you're probably doing more cutting edge stuff than most people here. |
| ||
| you should go to gamedev.com because this forum is for pure opengl coding in blitzmax and glsl is another kind of language very direfent from plain opengl or blitz. I'm introducing myself into glsl but i've found huge diferences in runtime from a graphic card to another (even with full opengl2.0 support), i've found diferent behaviours in diferent aplications too, wich makes me wonder if I will someday be able to compile something who will run somewhere else than in my computer... I've found diferences from RenderDonkey to ShaderDesigner (in RD it simply don't do parallax mapping, since the same code in SD works well). It's quite strange. Another thing I noticed is that Shader Designer's example shows a compile error in a GeForceFX (i don't remember the FX number sorry) since in my ATI radeon 9800 pro a large number of examples work but fractal kind don't. In RenderDonkey the same code compile well in my ATI but the effect don't work at all (parallax mapping). I haven't coded shaders inside BMX right now, and i'm finding my way into doing it but i have noticed one important thing: it seems it's not the same using ARB extensions than using actual OpengGL2.0 commands instead. It shouldn't be this way because the modif between the ARB and the final commands are very litle, however, it seems that the drivers of the graphic cards do have great diferences from ARB to final ones... This kind of things makes one turning mad because you actually don't know if it doesn't compile because of a coding error or because of an implementation deficience... (just this line makes my fragment shader turn absolutly mad: float A=gl_FragCoord.x) However, ATI drivers seems to be more tolerant than geforce ones. Good luck |
| ||
| thats why D3D and .FX is so popular. GL just hasn't kept up and tried to standardise across different hardware the same way D3D has. Supporting high end feature sin GL can be like coding your own video drivers specificly for certain cards, like you had to on older PC games pre DirectX. Bit of a nightmare. Particularly for artists who's shader tools favour D3D. Still, if you want cross platform I guess you havent much choise at the moment. |
| ||
| Hi, Haven't played with glsl for a while, but I think the idea is to find the 'index' of the shader sampler by name, and then use SetShaderConstInt or whatever it is with the texture unit the texture is bound to. |
| ||
| Yeah, Mark it's glUniformIArb(blah) with the sampler object. Discovered it the old fashioned way.(Looked at someone elses code :) ) - Joah, I know what you mean about not knowing why shaders fail to compile(I hate the generate lack of debug info too) but glsl does have shader and program logs(English) that can be 'got'. No idea the kind of information they return though. Here's a new version of shaderGen, for anyone interested. It now generates lights as well as blend modes/color scale.
Type ShaderGen
Method NewShader(name:String)
Local vertFile:String = name+"Vert.glsl"
Local pixFile:String = name+"Pix.glsl"
vfile=WriteFile(vertfile)
pfile=WriteFile(pixfile)
useLights=0
End Method
Method GenLights()
useLights=True
End Method
Method addTexture( blendMode,coordset,colorscale)
texblend[texnum]=blendmode
texset[texnum]=coordset
texcscale[texnum]=colorscale
texnum:+1
useTextures=1
End Method
Method genPPLights()
useppLights=True
End Method
Method Generate()
If useTextures
For Local j=1 To TexNum
WriteLine vfile,"varying vec2 texCoord"+j+";"
Next
EndIf
writeHeader(vfile)
If uselights
' Rem
WriteLine vfile,"vec3 normal,viewVector,halfVector;"
WriteLine vfile,"vec3 lightDir;"
WriteLine vfile,"vec4 diffuse, ambient, globalAmbient, specular = vec4(0.0);"
WriteLine vfile,"float ndotl,ndothv;"
WriteLine vfile,""
WriteLine vfile,"normal = normalize( gl_NormalMatrix * gl_Normal );"
WriteLine vfile,""
' Rem
For Local j=1 To lcount
WriteLine vfile,"lightDir = normalize( vec3( gl_LightSource["+(j-1)+"].position));"
WriteLine vfile,"ndotl = max( dot(normal,lightDir),0.0);"
WriteLine vfile,"diffuse=diffuse+gl_FrontMaterial.diffuse * gl_LightSource["+(j-1)+"].diffuse;"
WriteLine vfile,"ambient=ambient+gl_FrontMaterial.ambient * gl_LightSource["+(j-1)+"].ambient;"
WriteLine vfile,"globalAmbient=globalAmbient+gl_LightModel.ambient * gl_FrontMaterial.ambient;"
WriteLine vfile,""
WriteLine vfile,"if(ndotl>0.0){"
WriteLine vfile,"ndothv = max(dot(normal,normalize(gl_LightSource["+(j-1)+"].halfVector.xyz)),0.0);"
WriteLine vfile,"specular=specular+ gl_FrontMaterial.specular * gl_LightSource["+(j-1)+"].specular * pow(ndothv,gl_FrontMaterial.shininess);"
WriteLine vfile,"}"
WriteLine vfile,""
Next
'End Rem
WriteLine vfile,"gl_FrontColor = globalAmbient + ndotl * diffuse + ambient + specular;"
EndIf
WriteLine vfile,"gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
'writeVertexTForm()
If useTextures
For Local j=1 To texNum
WriteLine vfile,"texCoord"+j+"= vec2(gl_MultiTexCoord"+(j-1)+");"
Next
EndIf
writeEnd(vfile)
Local pixOut:String = ""
If useTextures
Local prePad:String
Local postPad:String
For Local j=1 To TexNum
WriteLine pfile,"varying vec2 texCoord"+j+";"
WriteLine pfile,"uniform sampler2D cTexture"+j+";"
prePad=""
postPad=""
If j>1
Select texblend[j-1]
Case T_Normal
pixOut=""
Case T_ADD
pixOut=pixOut+"+"
Case T_Modulated
pixOut=pixOut+"*"
Case T_Subtract
pixOut=pixOut+"-"
Default
Throw "Undefined texture blending mode."
End Select
EndIf
Select texcScale[j-1]
Case 1 'optimized. leaner. the real mcdaddy baddy.
Default
prePad="("
postPad="*"+texcScale[j-1]+")"
End Select
pixOut=pixOut+prePad+"texture2D(cTexture"+j+",texCoord"+texset[J-1]+")"+postPad
Next
pixOut=pixOut+";"
EndIf
writeHeader(pfile)
If useLights
For Local j=1 To lcount
Next
End If
WriteLine pfile,"gl_FragColor = gl_Color +"+pixout+";"
writeend(pfile)
CloseFile vfile
CloseFile pfile
End Method
Method writeVertexTForm()
WriteLine vfile,"gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
End Method
Method writeHeader(file)
WriteLine file,"void main()"
WriteLine file,"{"
End Method
Method writeEnd(file)
WriteLine file,"}"
End Method
Method addlight()
lcount:+1
uselights=True
End Method
Method reset()
uselights=0
usetextures=0
usepplights=0
texnum=0
lcount=0
End Method
Field lcount
Field useLights,useTextures
Field usePPLights,texNum
Field vfile,pfile,texcscale:Int[32]
Field texBlend:Int[32],texSet:Int[32]
Field dred!,dgreen!,dblue!
Field sred!,sgreen!,sblue!
End Type
example vert shader,
varying vec2 texCoord1;
void main()
{
vec3 normal,viewVector,halfVector;
vec3 lightDir;
vec4 diffuse, ambient, globalAmbient, specular = vec4(0.0);
float ndotl,ndothv;
normal = normalize( gl_NormalMatrix * gl_Normal );
lightDir = normalize( vec3( gl_LightSource[0].position));
ndotl = max( dot(normal,lightDir),0.0);
diffuse=diffuse+gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
ambient=ambient+gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
globalAmbient=globalAmbient+gl_LightModel.ambient * gl_FrontMaterial.ambient;
if(ndotl>0.0){
ndothv = max(dot(normal,normalize(gl_LightSource[0].halfVector.xyz)),0.0);
specular=specular+ gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(ndothv,gl_FrontMaterial.shininess);
}
lightDir = normalize( vec3( gl_LightSource[1].position));
ndotl = max( dot(normal,lightDir),0.0);
diffuse=diffuse+gl_FrontMaterial.diffuse * gl_LightSource[1].diffuse;
ambient=ambient+gl_FrontMaterial.ambient * gl_LightSource[1].ambient;
globalAmbient=globalAmbient+gl_LightModel.ambient * gl_FrontMaterial.ambient;
if(ndotl>0.0){
ndothv = max(dot(normal,normalize(gl_LightSource[1].halfVector.xyz)),0.0);
specular=specular+ gl_FrontMaterial.specular * gl_LightSource[1].specular * pow(ndothv,gl_FrontMaterial.shininess);
}
gl_FrontColor = globalAmbient + ndotl * diffuse + ambient + specular;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
texCoord1= vec2(gl_MultiTexCoord0);
}
|
| ||
| Ant, check this out if you aint seen it already: http://www.tomspeed.com/glsl/ I give up on this stuff til Mark brings out the real deal :) |
| ||
| Thanks, but ditto. :) |