c++ - 顶点位置/法线/坐标无法正确渲染

标签 c++ opengl-es-2.0

我无法将法线和 u,v 对发送到我的着色器。如果我删除法线,一切都会按预期进行。

编辑 看起来 v_normal 正在接收用于 v_coord 的值。我仍然不知道。 /编辑

这是我的顶点:

struct Vertex{
    Vertex(vec3 const & v) : pos(v) {}

    vec3 pos;
    vec3 normal;
    real u, v;
};

这是初始化代码:

    const int VERTEX_POS_INDX = 0;
    const int VERTEX_NORMAL_INDX = 1;
    const int VERTEX_TEXCOORD_INDX = 2;

    const int VERTEX_POS_SIZE = 3;
    const int VERTEX_NORMAL_SIZE = 3;
    const int VERTEX_TEXCOORD_SIZE = 2;

    GLuint vbo, ibo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sphere->vertices.size()*sizeof(Vertex), &sphere->vertices[0], GL_STATIC_DRAW);

    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sphere->indices.size()*sizeof(unsigned short), &sphere->indices[0], GL_STATIC_DRAW);

    glEnableVertexAttribArray ( VERTEX_POS_INDX );
    glEnableVertexAttribArray ( VERTEX_NORMAL_INDX );
    glEnableVertexAttribArray ( VERTEX_TEXCOORD_INDX );

    int offset = 0;

    glVertexAttribPointer ( VERTEX_POS_INDX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offset );
    offset += VERTEX_POS_SIZE * sizeof(real);

    glVertexAttribPointer ( VERTEX_NORMAL_INDX, VERTEX_NORMAL_SIZE, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offset );
    offset += VERTEX_NORMAL_SIZE * sizeof(real);

    glVertexAttribPointer ( VERTEX_TEXCOORD_INDX, VERTEX_TEXCOORD_INDX, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offset );

    glBindAttribLocation ( programObject, VERTEX_POS_INDX, "a_position" );
    glBindAttribLocation ( programObject, VERTEX_NORMAL_INDX, "a_normal" );
    glBindAttribLocation ( programObject, VERTEX_TEXCOORD_INDX, "a_coord" );

顶点着色器:

precision highp float;

uniform mat4 u_mv;
uniform mat4 u_mvp;
uniform vec3 u_light;
uniform vec3 u_up;

attribute vec3 a_position;
attribute vec2 a_coord;
attribute vec3 a_normal;

varying vec2 v_coord;
varying vec3 v_normal;

void main() {    
    v_coord = a_coord;
    v_normal = a_normal;
    gl_Position = u_mvp * vec4(a_position, 1);
}

片段着色器:

precision highp float;

uniform vec3 u_up;

varying vec3 v_normal;
varying vec2 v_coord;


precision highp float;

uniform vec3 u_up;

varying vec3 v_normal;
varying vec2 v_coord;

void main()
{
    vec2 coord = v_coord;
    vec3 normal = v_normal;
    coord.x = mod(v_coord.x * 5.0, 1.0);
    coord.y = mod(v_coord.y * 5.0, 1.0);
    gl_FragColor = vec4 (
        mod(coord.x*1.0,1.0),
        mod(coord.y*1.0,1.0),
        mod(normal.z*5.0,1.0)*0.0,
        1.0 );
}

最佳答案

我只需要使用 glGetAttributeLocation 来定义索引,而不是假设 glBindAttributeLocation 可以解决问题。

编辑 在链接程序之前使用 bind 属性函数达到了目的,并保留了我对代码的意图。

关于c++ - 顶点位置/法线/坐标无法正确渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11203601/

相关文章:

c++ - GetPrivateProfileStringA() 切断我的配置值编号

android - 如何从 opegles 着色器中读出变量?

opengl-es-2.0 - opengl纹理映射偏离5-8像素

c++ - 从 C++ 运行命令

c++ - 奇怪的 Xcode 链接器警告构建 Poco C++ 应用程序

c++ - 为什么我可以通过指针访问私有(private)数据成员,我应该这样做吗?

javascript - 如何在着色器中处理 Float32Array? (WebGL)

c++ - OpenCV iOS 和 64 位架构

ios - 在 iOS Open GL ES 中使用 GL_LINES 渲染对象的最小尺寸

ios - 如何使用 GLKit 的 GLKMatrixStack 库生成模型 View 矩阵?