我是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);
我是否仍然怀念某事或我做错了
答案 0 :(得分:3)
好吧,让我们从纠正sizeof()开始吧。 您的代码中有很多地方使用sizeof错误:
sizeof(GL_FLOAT)
GL_FLOAT
为enum
(不是float
),您应该使用sizeof(GLfloat)
或sizeof(float)
我相信它在iOS上很好,因为sizeof(int)
实际上等于sizeof(float)
,但它是错误的。
其次,更重要的是你的fabs()
电话。首先它应该是abs()
而不是fabs()。还有为什么有2个参数?据我所知abs()
只有一个参数。我很确定这些东西是你的头脑的理由,你的着色器无法编译,所以你不会在屏幕上显示你的图像。