1

OpenGL / C ++を使用して、画像(すでに背景に表示されている)の特定の個々のピクセルを強調表示( "color#00FFFF")しようとしています。glTranslatef()ピクセル座標と画像は正確な2D空間に存在しますが、これまでのプロジェクトで見たすべてのOpenGLコードglScalef()は3Dでフロートベースであり、オブジェクトの配置は時間とは別に行われているように見えます描かれました。

私はJavaのGraphics2Dパッケージに慣れています。そこでは、次のような効果をもたらすものを呼び出すことができます。

width = 1; height = 1;
buffer.drawRect(width, height, xPosition, yPosition);

指定した場所のピクセルを塗りつぶします。OpenGLで、サイズの設定、位置の設定、すべてを1行で描画できる構文に似たものはありますか?そうでない場合は、2D +ピクセル入力をOpenGLのfloatおよび3D構造に適応させるにはどうすればよいですか?

私は現在これを持っています:

glPushMatrix();
glTranslatef(0.0f, 0.0f, -5.0f);
glColor3f(0, 1, 1);
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex3f(1.0f, 1.0f, 1.0f);
glPopMatrix();

これをGoogle検索やコードの他の部分からつなぎ合わせましたが、何も描画されていません。変換、頂点、またはポイントサイズコマンドの単位がわかりません。これらすべてを上記のJavaコマンドのようなものに置き換えることができれば素晴らしいと思います。そうでない場合は、ここで描いたものが他のすべての「上」にあることを保証できる方法はありますが、それでもカメラの後ろにはありません。

4

1 に答える 1

1

OpenGLで、サイズの設定、位置の設定、すべてを1行で描画できる構文に似たものはありますか?

glRect()

#include <GL/glut.h>

void display()
{
    glEnable( GL_CULL_FACE );
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE );

    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );

    glDepthMask( GL_TRUE );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // draw teapot
    glEnable( GL_DEPTH_TEST );
    glDepthMask( GL_TRUE );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 60, w / h, 1, 100 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( 0, 0, -5 );

    glColor4ub( 255, 0, 0, 255 );
    glPushMatrix(); 
    float angle = 60.0f * ( glutGet(GLUT_ELAPSED_TIME) / 1000.0f );
    glRotatef( angle, 0.1, 0.95, 0.05 );
    glutSolidTeapot( 1.0 );
    glPopMatrix();

    // draw rectangle
    glDisable( GL_DEPTH_TEST );
    glDepthMask( GL_FALSE );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, w, 0, h, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor4ub( 0, 255, 0, 128 );
    glRecti( 0 + 50, 0 + 50, w - 50, h - 50 );

    glutSwapBuffers();
}

void timer( int extra )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "Rect" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
于 2013-01-03T20:19:48.090 に答える