diff --git a/OpenRA.Renderer.Gl/Shader.cs b/OpenRA.Renderer.Gl/Shader.cs index 6e7a6b1768..453dae3321 100644 --- a/OpenRA.Renderer.Gl/Shader.cs +++ b/OpenRA.Renderer.Gl/Shader.cs @@ -25,6 +25,7 @@ namespace OpenRA.Renderer.Glsl { this.type = type; Console.WriteLine("Loading shader: {0}",type); + // Vertex shader string vertexCode; using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type)))) @@ -40,7 +41,7 @@ namespace OpenRA.Renderer.Glsl // Fragment shader string fragmentCode; - using (var file = new StreamReader(FileSystem.Open("glsl{0}rgba.frag".F(Path.DirectorySeparatorChar, type)))) + using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type)))) fragmentCode = file.ReadToEnd(); int f = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER); GraphicsDevice.CheckGlError(); @@ -69,27 +70,38 @@ namespace OpenRA.Renderer.Glsl public void Render(Action a) { - GraphicsDevice.CheckGlError(); Gl.glUseProgram(program); GraphicsDevice.CheckGlError(); - Console.WriteLine("rendering"); a(); GraphicsDevice.CheckGlError(); - Gl.glUseProgram(0); - GraphicsDevice.CheckGlError(); } public void SetValue(string name, ITexture t) - { - - } - - public void SetValue(string name, float x, float y) - { + { + Gl.glUseProgram(program); GraphicsDevice.CheckGlError(); - Console.WriteLine("setting value {0} to {1},{2} in {3}",name,x,y,type); + var texture = (Texture)t; int param = Gl.glGetUniformLocation(program, name); GraphicsDevice.CheckGlError(); + + + if (texture != null && param >= 0) + { + //texture.texture = 0; + Console.WriteLine("setting {0}:{1} to {2}",type,name,texture.texture); + Gl.glUniform1i(param, texture.texture); + GraphicsDevice.CheckGlError(); + + } + } + + public void SetValue(string name, float x, float y) + { + Gl.glUseProgram(program); + GraphicsDevice.CheckGlError(); + //Console.WriteLine("setting {3}:{0} to ({1},{2})",name,x,y,type); + int param = Gl.glGetUniformLocation(program, name); + GraphicsDevice.CheckGlError(); Gl.glUniform2f(param,x,y); GraphicsDevice.CheckGlError(); } diff --git a/OpenRA.Renderer.Gl/Texture.cs b/OpenRA.Renderer.Gl/Texture.cs index db4f2078ec..47c430169c 100644 --- a/OpenRA.Renderer.Gl/Texture.cs +++ b/OpenRA.Renderer.Gl/Texture.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made @@ -34,6 +34,23 @@ namespace OpenRA.Renderer.Glsl SetData(bitmap); } + void PrepareTexture() + { + Gl.glActiveTexture(Gl.GL_TEXTURE0 + texture); + GraphicsDevice.CheckGlError(); + Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture); + GraphicsDevice.CheckGlError(); + Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST); + GraphicsDevice.CheckGlError(); + Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST); + GraphicsDevice.CheckGlError(); + + Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_BASE_LEVEL, 0); + GraphicsDevice.CheckGlError(); + Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0); + GraphicsDevice.CheckGlError(); + } + public void SetData(byte[] colors, int width, int height) { if (!IsPowerOf2(width) || !IsPowerOf2(height)) @@ -44,13 +61,7 @@ namespace OpenRA.Renderer.Glsl fixed (byte* ptr = &colors[0]) { IntPtr intPtr = new IntPtr((void*)ptr); - - Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture); - GraphicsDevice.CheckGlError(); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_BASE_LEVEL, 0); - GraphicsDevice.CheckGlError(); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0); - GraphicsDevice.CheckGlError(); + PrepareTexture(); Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr); GraphicsDevice.CheckGlError(); @@ -72,13 +83,7 @@ namespace OpenRA.Renderer.Glsl fixed (uint* ptr = &colors[0,0]) { IntPtr intPtr = new IntPtr((void *) ptr); - - Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture); - GraphicsDevice.CheckGlError(); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_BASE_LEVEL, 0); - GraphicsDevice.CheckGlError(); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0); - GraphicsDevice.CheckGlError(); + PrepareTexture(); Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr); GraphicsDevice.CheckGlError(); @@ -93,23 +98,16 @@ namespace OpenRA.Renderer.Glsl //throw new InvalidOperationException( "non-power-of-2-texture" ); bitmap = new Bitmap(bitmap, new Size(NextPowerOf2(bitmap.Width), NextPowerOf2(bitmap.Height))); } - - Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture); - GraphicsDevice.CheckGlError(); - + var bits = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_BASE_LEVEL, 0); - GraphicsDevice.CheckGlError(); - Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0); - GraphicsDevice.CheckGlError(); + PrepareTexture(); Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, bits.Width, bits.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bits.Scan0); // todo: weird strides GraphicsDevice.CheckGlError(); - bitmap.UnlockBits(bits); } diff --git a/glsl/chrome-rgba.frag b/glsl/chrome-rgba.frag new file mode 100644 index 0000000000..7f52d6d4ac --- /dev/null +++ b/glsl/chrome-rgba.frag @@ -0,0 +1,5 @@ +uniform sampler2D DiffuseTexture; +void main() +{ + gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st); +} \ No newline at end of file diff --git a/glsl/chrome-rgba.vert b/glsl/chrome-rgba.vert index c2e97de386..0a10445d30 100644 --- a/glsl/chrome-rgba.vert +++ b/glsl/chrome-rgba.vert @@ -1,8 +1,8 @@ uniform vec2 r1; uniform vec2 r2; // matrix elements - void main() { - vec2 p = gl_Vertex.xy*vec2(0.001538462,-0.0025) + vec2(-1,1); + vec2 p = gl_Vertex.xy*r1 + r2; gl_Position = vec4(p.x,p.y,0,1); + gl_TexCoord[0] = gl_MultiTexCoord0; } diff --git a/glsl/chrome-shp.frag b/glsl/chrome-shp.frag new file mode 100644 index 0000000000..a6bc742dfe --- /dev/null +++ b/glsl/chrome-shp.frag @@ -0,0 +1,6 @@ +uniform sampler2D DiffuseTexture; + +void main() +{ + gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st); +} \ No newline at end of file diff --git a/glsl/world-line.frag b/glsl/world-line.frag new file mode 100644 index 0000000000..a6bc742dfe --- /dev/null +++ b/glsl/world-line.frag @@ -0,0 +1,6 @@ +uniform sampler2D DiffuseTexture; + +void main() +{ + gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st); +} \ No newline at end of file diff --git a/glsl/world-shp.frag b/glsl/world-shp.frag new file mode 100644 index 0000000000..2d8adfb7c3 --- /dev/null +++ b/glsl/world-shp.frag @@ -0,0 +1,10 @@ +uniform sampler2D DiffuseTexture, Palette; + +void main() +{ + //float4 x = tex2D(DiffuseTexture, f.Tex0.xy); + //float2 p = float2( dot(x, f.ChannelMask), f.Tex0.z ); + //return tex2D(Palette, p); + //st + gl_FragColor = texture2D(Palette,gl_TexCoord[0].xy); +} \ No newline at end of file diff --git a/glsl/world-shp.vert b/glsl/world-shp.vert index e9c55770f8..3c5a3739d4 100644 --- a/glsl/world-shp.vert +++ b/glsl/world-shp.vert @@ -1,9 +1,9 @@ uniform vec2 Scroll; -uniform vec2 r1; -uniform vec2 r2; // matrix elements +uniform vec2 r1,r2; // matrix elements void main() { - vec2 p = (gl_Vertex.xy); - gl_Position = gl_Vertex; + vec2 p = (gl_Vertex.xy - Scroll.xy)*r1 + r2; + gl_Position = vec4(p.x,p.y,0,1); + gl_TexCoord[0] = gl_MultiTexCoord0; }