【发布时间】:2011-11-12 11:59:33
【问题描述】:
几天前我找到了 Gwen,并认为它看起来是我项目的完美 GUI 工具包。但是,亲爱的,看看渲染器中的所有 OpenGL 2 代码。所以我想我会写一个 OpenGL 3 渲染器,这样我就可以实际使用它了,但是我对 CG 比对 GLSL 更熟悉,而且我一直在编写示例。我想如果我能把这些统一的变量设置好的话,应该基本就搞定了。
着色器编译和链接没有问题。我将范围缩小到 glGetUniformLocation 为正交矩阵和纹理采样器返回 -1,但我不知道它为什么会这样做。典型的问题似乎是,如果您实际上不使用它们,它们会被优化,但我已经使用了它们。
如果有人有任何想法,我会全力以赴。一旦它正常工作,将非常乐意发布/链接完整的东西。这是我第一次尝试 GLSL,所以我很容易做一些愚蠢的事情。我刚刚完成了另一个项目的 CG 设置,所以我并不是完全一无所知。
设置 OpenGL 上下文后调用的着色器初始化代码:
void InitializeShaders(void)
{
g_ShaderProgram = glCreateProgram();
g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);
glCompileShader(g_VertexShader);
CheckShaderCompile(g_VertexShader);
glCompileShader(g_FragmentShader);
CheckShaderCompile(g_FragmentShader);
glAttachShader(g_ShaderProgram, g_VertexShader);
glAttachShader(g_ShaderProgram, g_FragmentShader);
glBindAttribLocation(g_ShaderProgram, 0, "position");
glBindAttribLocation(g_ShaderProgram, 1, "color");
glBindAttribLocation(g_ShaderProgram, 2, "texCoord");
glBindFragDataLocation(g_ShaderProgram, 0, "color");
glLinkProgram(g_ShaderProgram);
CheckShaderLink();
g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}
着色器作为字符串存储在头文件中,但我去掉了所有的换行符和反斜杠,因此它们看起来不那么痛苦。
顶点着色器:
#version 330
in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{
outPosition = position * orthoTransform;
}
片段着色器:
#version 330
in vec2 texCoord;
in vec4 color;
out vec4 outColor;
uniform sampler2D textureSampler;
void main(void)
{
//outColor = texture(textureSampler, texCoord) * color;
outColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
【问题讨论】:
-
另外,除非
orthoTransform是一个转置矩阵(或者如果你喜欢,你应该右乘position,而不是像你现在做的那样在左边。如果你确实转置了它,那么在你的glUniformMatrix调用上正确设置转置标志并右乘它。
标签: opengl glsl shader opengl-3