OpenGLES不能在iOS中的顶点着色器中使用输入参数

时间:2014-12-15 19:20:31

标签: ios opengl-es glsl

我是OpenGLES的新手,我想画一幅图像。在我的着色器文件中使用输入float变量时出现问题。我的示例代码在这里

---绘图代码

//Loading image texture with name "texName"
//........

//get index attribute and uniform

**//Get index of flag**
GLuint a_ver_flag_drawing_type = glGetAttribLocation(program[PROGRAM_POINT].id, "a_drawingType");

GLuint a_position_location = glGetAttribLocation(program[PROGRAM_POINT].id, "a_Position");
GLuint a_texture_coordinates_location = glGetAttribLocation(program[PROGRAM_POINT].id, "a_TextureCoordinates");
GLuint u_texture_unit_location = glGetUniformLocation(program[PROGRAM_POINT].id, "u_TextureUnit");

//Bind image texture with name "texName"
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texName);
glUniform1i(u_texture_unit_location, 0);

const float textrect[] = {-1.0f, -1.0f, 0.0f, 0.0f,
    -1.0f,  1.0f, 0.0f, 1.0f,
    1.0f, -1.0f, 1.0f, 0.0f,
    1.0f,  1.0f, 1.0f, 1.0f};

glBindBuffer(GL_ARRAY_BUFFER, vboId_1);
glBufferData(GL_ARRAY_BUFFER, sizeof(textrect), textrect, GL_DYNAMIC_DRAW);

**//Set value for flag**
glVertexAttrib1f(a_ver_flag_drawing_type, 1.0f);

glVertexAttribPointer(a_position_location, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (void*)(0));
glVertexAttribPointer(a_texture_coordinates_location, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT)));

glEnableVertexAttribArray(a_ver_flag_drawing_type);
glEnableVertexAttribArray(a_position_location);
glEnableVertexAttribArray(a_texture_coordinates_location);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];

---我的顶点着色器文件

//Flag
attribute float a_drawingType;
varying highp float v_drawing_type;

//For drawing
attribute vec4 inVertex;

uniform mat4 MVP;
uniform float pointSize;
uniform lowp vec4 vertexColor;

varying lowp vec4 color;

//For texture
attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;

varying vec2 v_TextureCoordinates;

void main()
{
      v_drawing_type = a_drawingType;

//    if (fabs(a_drawingType - 1.0) < 0.00001) {
//        //Draw texture
           //v_TextureCoordinates = a_TextureCoordinates;
           //gl_Position = a_Position;
//    } else {
           //Draw some other stuff
//    }

    //Draw texture
    v_TextureCoordinates = a_TextureCoordinates;
    gl_Position = a_Position;
}

---我的片段着色器文件

precision mediump float;

uniform sampler2D texture;
varying lowp vec4 color;

uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;

varying highp float v_drawing_type;

void main()
{
//    //Drawing point
//    gl_FragColor = color * texture2D(texture, gl_PointCoord);

    //Draw texture
    gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}

如果只是这些代码,我可以绘制我想要的图像。但是,如果我取消注释顶点着色器文件上的if语句代码

if (fabs(a_drawingType - 1.0) < 0.00001) {
      //Draw texture
     v_TextureCoordinates = a_TextureCoordinates;
     gl_Position = a_Position;
} else {
     //Draw some other stuff
}

图像不再显示在屏幕上。我真的不知道为什么会这样。我想要这个标志来修改我的绘图。如果a_drawing_type是1.0,我将绘制图像,否则我将绘制其他东西。我调试我的绘图代码,看看我是否取消注释这个if语句,我可以在这些行获取这些属性的索引

**//Get index of flag**
GLuint a_ver_flag_drawing_type = glGetAttribLocation(program[PROGRAM_POINT].id, "a_drawingType");

GLuint a_position_location = glGetAttribLocation(program[PROGRAM_POINT].id, "a_Position");
GLuint a_texture_coordinates_location = glGetAttribLocation(program[PROGRAM_POINT].id, "a_TextureCoordinates");
GLuint u_texture_unit_location = glGetUniformLocation(program[PROGRAM_POINT].id, "u_TextureUnit");

但是如果我评论if语句,再次调试并看到这些索引的值为4294967295,我认为当它无法获取索引时,它的最大值为max。

有人能告诉我if语句有什么问题,我这个问题花了2天时间。

更新: 我基于@Anonymous回答修复了上述问题,但我还有另一个与之相关的问题: 我想将顶点着色器上的a_drawingType值传递给片段着色器中的变量v_drawing_type,所以代码行

v_drawing_type = a_drawingType;
顶点着色器上的

是对的,不是吗?但现在在片段着色器文件中,我添加了一个if语句来检查v_drawing_type的值

if (abs(v_drawing_type - 1.0) < 0.0001) {

}

它还会在行

引发崩溃问题
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

我是否仍然怀念某事或我做错了

1 个答案:

答案 0 :(得分:3)

好吧,让我们从纠正sizeof()开始吧。 您的代码中有很多地方使用sizeof错误:

sizeof(GL_FLOAT)

GL_FLOATenum(不是float),您应该使用sizeof(GLfloat)sizeof(float) 我相信它在iOS上很好,因为sizeof(int)实际上等于sizeof(float),但它是错误的。

其次,更重要的是你的fabs()电话。首先它应该是abs()而不是fabs()。还有为什么有2个参数?据我所知abs()只有一个参数。我很确定这些东西是你的头脑的理由,你的着色器无法编译,所以你不会在屏幕上显示你的图像。