小编Apo*_*ate的帖子

为什么glGetUniformLocation让我失望?

我几天前找到了Gwen,认为它看起来像是我项目的完美GUI工具包.但是哦,亲爱的,看一下渲染器中的所有OpenGL 2代码.所以我以为我会写一个OpenGL 3渲染器,所以我可以实际使用它,但我比CG更熟悉CG而且我已经让自己陷入了编写样本的困境.我想如果我能够设置这些统一变量,它应该基本完成.

着色器编译和链接没有问题.我把它缩小到glGetUniformLocation,为正交矩阵和纹理采样器返回-1,但我不知道为什么它正在这样做.典型的问题似乎是,如果你实际上没有使用它们,它们会被优化出来,但我已经将它们用于两者.

如果有人有任何想法,我会全力以赴.一旦它正常工作,将非常乐意发布/链接完整的东西.这是我对GLSL的第一次尝试,所以我很容易做一些愚蠢的事情.我刚刚完成为另一个项目设置CG,所以我不是完全无能为力.

设置OpenGL上下文后调用Shader Init代码:

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");
}
Run Code Online (Sandbox Code Playgroud)

着色器作为字符串存储在头文件中,但我删除了所有换行符和反斜杠,因此它们看起来不那么痛苦.

顶点着色器:

#version 330

in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{ …
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl opengl-3

10
推荐指数
1
解决办法
1万
查看次数

绑定到OpenGL 3.x VBO

我正在尝试更新我以前使用OpenGL 2.x样式顶点数组的引擎来使用OpenGL 3.x,这意味着更新到VAO/VBO.我想我并没有正确地约束VBO.阅读下面的更多信息或跳到代码,找到我做错了什么.

我的网格类的快速概述看起来像这样:

啮合

  • root MeshNode

MeshNode

  • 转变
  • VAO指数
  • index VBO指数
  • 子MeshNodes数组
  • MeshObjects数组

MeshObject

  • 从文件加载的所有顶点和索引数据,用于整个网格的单个部分
  • 顶点VBO索引

如果我绘制一个只有一个MeshObject的MeshNode,它似乎画得很好.当我绘制一个具有多个MeshObjects的MeshNode时,我得到的东西就是我想要绘制的模型的一般形状,但有点乱码.

我已经通过gDEbugger检查了Visual Studio调试器中的顶点数据和VBO数据,它看起来都很好,所以我非常确定从文件加载到VBO中的加载工作正常.

我使用gDEbugger强制它为所有顶点而不是三角形绘制点,并且它具有单个MeshObject的形状,这使我相信我只是没有正确地绑定到不同的VBO.好像它试图用不同的索引绘制,但每次都是相同的顶点.

VertexData如下所示:

struct VertexData
{
    enum
    {
        NUM_TEXCOORDS = 1,
    };
    vector3 vertex;
    vector3 normal;
    vector2 texCoord[NUM_TEXCOORDS];
};
Run Code Online (Sandbox Code Playgroud)

相关的MeshNode代码:

void MeshNode::initVAO(void)
{
    closeVAO();

    unsigned int scan;

    //init index data
    if (m_meshObjects.size() > 0)
    {
        glGenVertexArrays(1, &m_meshVAO);
        glBindVertexArray(m_meshVAO);
        {
            //add up the total index count for all the mesh objects in this node
            unsigned int indexCount = 0;
            for (scan = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d vbo opengl-3

8
推荐指数
1
解决办法
3388
查看次数

标签 统计

opengl ×2

opengl-3 ×2

3d ×1

c++ ×1

glsl ×1

shader ×1

vbo ×1