Fix setting uniforms; chrome-rgba shader works, but lacks alpha blending.
This commit is contained in:
@@ -25,6 +25,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
this.type = type;
|
this.type = type;
|
||||||
Console.WriteLine("Loading shader: {0}",type);
|
Console.WriteLine("Loading shader: {0}",type);
|
||||||
|
|
||||||
// Vertex shader
|
// Vertex shader
|
||||||
string vertexCode;
|
string vertexCode;
|
||||||
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type))))
|
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
|
// Fragment shader
|
||||||
string fragmentCode;
|
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();
|
fragmentCode = file.ReadToEnd();
|
||||||
int f = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER);
|
int f = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
@@ -69,27 +70,38 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
|
|
||||||
public void Render(Action a)
|
public void Render(Action a)
|
||||||
{
|
{
|
||||||
GraphicsDevice.CheckGlError();
|
|
||||||
Gl.glUseProgram(program);
|
Gl.glUseProgram(program);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
Console.WriteLine("rendering");
|
|
||||||
a();
|
a();
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
Gl.glUseProgram(0);
|
|
||||||
GraphicsDevice.CheckGlError();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetValue(string name, ITexture t)
|
public void SetValue(string name, ITexture t)
|
||||||
{
|
{
|
||||||
|
Gl.glUseProgram(program);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetValue(string name, float x, float y)
|
|
||||||
{
|
|
||||||
GraphicsDevice.CheckGlError();
|
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);
|
int param = Gl.glGetUniformLocation(program, name);
|
||||||
GraphicsDevice.CheckGlError();
|
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);
|
Gl.glUniform2f(param,x,y);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#region Copyright & License Information
|
#region Copyright & License Information
|
||||||
/*
|
/*
|
||||||
* Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
|
* Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
|
||||||
* This file is part of OpenRA, which is free software. It is made
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
@@ -34,6 +34,23 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
SetData(bitmap);
|
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)
|
public void SetData(byte[] colors, int width, int height)
|
||||||
{
|
{
|
||||||
if (!IsPowerOf2(width) || !IsPowerOf2(height))
|
if (!IsPowerOf2(width) || !IsPowerOf2(height))
|
||||||
@@ -44,13 +61,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
fixed (byte* ptr = &colors[0])
|
fixed (byte* ptr = &colors[0])
|
||||||
{
|
{
|
||||||
IntPtr intPtr = new IntPtr((void*)ptr);
|
IntPtr intPtr = new IntPtr((void*)ptr);
|
||||||
|
PrepareTexture();
|
||||||
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();
|
|
||||||
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height,
|
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height,
|
||||||
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr);
|
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
@@ -72,13 +83,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
fixed (uint* ptr = &colors[0,0])
|
fixed (uint* ptr = &colors[0,0])
|
||||||
{
|
{
|
||||||
IntPtr intPtr = new IntPtr((void *) ptr);
|
IntPtr intPtr = new IntPtr((void *) ptr);
|
||||||
|
PrepareTexture();
|
||||||
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();
|
|
||||||
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height,
|
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height,
|
||||||
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr);
|
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, intPtr);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
@@ -93,23 +98,16 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
//throw new InvalidOperationException( "non-power-of-2-texture" );
|
//throw new InvalidOperationException( "non-power-of-2-texture" );
|
||||||
bitmap = new Bitmap(bitmap, new Size(NextPowerOf2(bitmap.Width), NextPowerOf2(bitmap.Height)));
|
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(
|
var bits = bitmap.LockBits(
|
||||||
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
||||||
ImageLockMode.ReadOnly,
|
ImageLockMode.ReadOnly,
|
||||||
PixelFormat.Format32bppArgb);
|
PixelFormat.Format32bppArgb);
|
||||||
|
|
||||||
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_BASE_LEVEL, 0);
|
PrepareTexture();
|
||||||
GraphicsDevice.CheckGlError();
|
|
||||||
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0);
|
|
||||||
GraphicsDevice.CheckGlError();
|
|
||||||
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, bits.Width, bits.Height,
|
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
|
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bits.Scan0); // todo: weird strides
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
|
|
||||||
bitmap.UnlockBits(bits);
|
bitmap.UnlockBits(bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
glsl/chrome-rgba.frag
Normal file
5
glsl/chrome-rgba.frag
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
uniform sampler2D DiffuseTexture;
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st);
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
uniform vec2 r1;
|
uniform vec2 r1;
|
||||||
uniform vec2 r2; // matrix elements
|
uniform vec2 r2; // matrix elements
|
||||||
|
|
||||||
void main()
|
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_Position = vec4(p.x,p.y,0,1);
|
||||||
|
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
}
|
}
|
||||||
|
|||||||
6
glsl/chrome-shp.frag
Normal file
6
glsl/chrome-shp.frag
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
uniform sampler2D DiffuseTexture;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st);
|
||||||
|
}
|
||||||
6
glsl/world-line.frag
Normal file
6
glsl/world-line.frag
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
uniform sampler2D DiffuseTexture;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = texture2D(DiffuseTexture,gl_TexCoord[0].st);
|
||||||
|
}
|
||||||
10
glsl/world-shp.frag
Normal file
10
glsl/world-shp.frag
Normal file
@@ -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);
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
uniform vec2 Scroll;
|
uniform vec2 Scroll;
|
||||||
uniform vec2 r1;
|
uniform vec2 r1,r2; // matrix elements
|
||||||
uniform vec2 r2; // matrix elements
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec2 p = (gl_Vertex.xy);
|
vec2 p = (gl_Vertex.xy - Scroll.xy)*r1 + r2;
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(p.x,p.y,0,1);
|
||||||
|
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user