无法在Raspberry Pi上获得OpenGL ES 2着色器浮动均匀值

时间:2015-01-03 12:07:21

标签: c++ opengl-es raspberry-pi

我想将浮点作为一个统一体传递给我的顶点着色器,因为每个顶点都会对此参数使用相同的值。它在我的计算机(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 );

0 个答案:

没有答案