我想将浮点作为一个统一体传递给我的顶点着色器,因为每个顶点都会对此参数使用相同的值。它在我的计算机(linux / gles)上运行良好,但在Raspberry Pi上,执行时的值根本不正确。 我使用bcm_host.h和EGL来设置我的OpenGL上下文。
我写了一个简单的代码来演示这个。它应该在1秒内显示蓝色三角形,然后是红色三角形,然后是蓝色三角形......
在Pi上执行期间未设置OpenGL错误,但三角形保持蓝色。 我通过一些图形测试来查找值,它看起来像是一个负的浮点数。
这很奇怪,因为我使用制服制作矩阵,而且这些作品效果很好。
顶点着色器:
#version 100
precision mediump float;
uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
uniform float test;
attribute vec3 a_Vertex;
varying vec4 color;
void main( void )
{
if( test == 500.0 )
color = vec4( 1.0, 0.0, 0.0, 1.0 );
else
color = vec4( 0.0, 0.0, 1.0, 1.0 );
gl_Position = projection_matrix * modelview_matrix * vec4( a_Vertex, 1.0 );
}
片段着色器:
#version 100
precision mediump float;
varying vec4 color;
void main(void)
{
gl_FragColor = color;
}
C ++显示代码:
if( ticks - lastDrawTicks > 1000 )
{
Screen::get()->clear();
program->use();
program->sendUniform( "projection_matrix", projection, false );
program->sendUniform( "modelview_matrix", modelview, false );
if( value )
{
int location = glGetUniformLocation( program->getId(), "test" );
CheckOpenGLError(glGetUniformLocation);
Logger::get() << location << " <- Red !" << Logger::endl;
glUniform1f( location, 500.0f );
CheckOpenGLError(glUniform1f);
//program->sendUniform( "test", 500.0f );
value = false;
}
else
{
int location = glGetUniformLocation( program->getId(), "test" );
CheckOpenGLError(glGetUniformLocation);
Logger::get() << location << " <- Blue !" << Logger::endl;
glUniform1f( location, 0.0f );
CheckOpenGLError(glUniform1f);
//program->sendUniform( "test", 0.0f );
value = true;
}
program->sendVertexPointer( "a_Vertex", vbo );
ibo->draw();
Screen::get()->render();
lastDrawTicks = ticks;
}
修改
使用“glUniform1fv”而不是“glUniform1f”正在工作。
float fvalue = 500.0f;
glUniform1fv( location, 1, &fvalue );