着色器在 Opengl Shader Builder 上工作,但不在我的 OpenGL 应用程序中

Posted

技术标签:

【中文标题】着色器在 Opengl Shader Builder 上工作,但不在我的 OpenGL 应用程序中【英文标题】:Shader working on Opengl Shader Builder but not in my OpenGL application 【发布时间】:2013-07-12 09:04:32 【问题描述】:

所以我正在测试我的着色器(Apple 的 OpenGL Shader Builder 上的顶点 + 片段 + (只需导入我的着色器文件),尽管到目前为止它似乎工作正常,但当我尝试使用它们时它似乎不起作用在我的 OpenGL 应用程序中。 我想要最简单的环境+漫射照明。

编辑:: 我正在从这个网格(obj 波前)导入数据 -> http://pastebin.com/cDyjHHNn

这里是问题的捕获: (OpenGL Shader Builder 上的茶壶,OpenGL 应用程序上的立方体)

我的顶点着色器:

#version 120

vec4 ambien = vec4(0.2,0.2,0.2,1.0);
vec4 diffuz = vec4(1.0,1.0,1.0,1.0);

//Fixed Light source position.
vec3 LS = vec3(0.0, 15.0, 5.0);

void main()


        gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;

        vec4 LS2;
        //LS2 = gl_ModelViewProjectionMatrix * vec4(LS,1.0);
        vec3 normal, lightDir;
        vec4 diffuse, ambient, globalAmbient;
        float NdotL;

        normal = normalize(gl_NormalMatrix * gl_Normal);
        lightDir = normalize(LS.xyz);
        NdotL = max(dot(normal, lightDir), 0.0);
        diffuse = diffuz * diffuz;

        ambient = ambien * ambien;
        globalAmbient = ambien * ambien;

        gl_FrontColor =  NdotL * diffuse + globalAmbient + ambient;


     

我的片段着色器:

#version 120

void main(void)


    gl_FragColor = gl_Color;

还有我的 OpenGL 应用程序绘图例程:

- (void) drawFrameWithObject


    [[self openGLContext] makeCurrentContext];
    [sM useProgram];


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    glClearColor(1.0f,1.0f,1.0f,1.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    float aspect = (float)1024 / (float)576;
    glOrtho(-aspect, aspect, -1, 1, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, 0.0f);
    glScalef(0.3f, 0.3f, 0.3f);

    glRotatef(self.rotValue, 1.0f, 1.0f, 0.0f);


    glEnableClientState(GL_VERTEX_ARRAY);  
    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    glBindBuffer(GL_ARRAY_BUFFER, vBo[0]);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, vBo[1]);
    glNormalPointer(GL_FLOAT, 0, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vBo[2]);
    glDrawElements(GL_TRIANGLES, object.indicesCount, GL_UNSIGNED_INT, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDisableClientState(GL_VERTEX_ARRAY);

    [[self openGLContext] flushBuffer];

底线,因为我的着色器在 OpenGL Shader Builder 中工作,我想我可以安全地假设问题不在我的着色器中。可能是我的应用程序中的转换?我缺少一些缺少的opengl状态/设置/属性?我做了很多实验,不知道出了什么问题。

【问题讨论】:

您的几何数据是什么样的?看起来你的立方体只是有错误的法线(看起来所有顶点都有相同的法线)。 pastebin.com/cDyjHHNn 我的 .obj(波前)网格。我也会编辑并将其放在我的问题中。 那么下一个问题,您的 OBJ 加载是否正常工作?来吧,一个工作的 OBJ 文件不需要使它免受任何错误的影响。等等,我已经找到问题了。 【参考方案1】:

您将glNormalPointer 设置为您假定的正常数据,但是您完全忘记使用glEnableClientState(GL_NORMAL_ARRAY) 启用正常数组(并且不要忘记在绘制后再次禁用它),就像您对位置所做的那样大批。所以你所有的顶点都有相同的默认法线,这完全符合你观察到的效果。

【讨论】:

这甚至不值得成为一个真正的问题

以上是关于着色器在 Opengl Shader Builder 上工作,但不在我的 OpenGL 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL入门之着色器Shader

着色器在 2d OpenGL 中不起作用

OpenGL入门之着色器Shader

如何使用OpenGL着色器在平面上绘制没有透视的纹理?

OpenGL播放yuv数据流(着色器SHADER)-android

OpenGL4.3新特性: 计算着色器 Compute Shader