2

Mesa 3Dは、osmesa32を介して32ビット浮動小数点カラーチャネルをサポートすると主張しています。問題は、浮動小数点数が8ビットに量子化されることです。他の誰かがこれに気づきましたか?以下は、私がテストに使用している短いプログラムです。特定の浮動小数点色で平面を描画し(ビュー全体を占める)、最初のピクセルの色を読み取ります。

#include <stdio.h>
#include <stdlib.h>
#include "GL/osmesa.h"
#include "GL/glut.h"

#define WIDTH 100
#define HEIGHT 100

void draw()
{
GLint r, g, b, a;
glGetIntegerv(GL_RED_BITS, &r);
glGetIntegerv(GL_GREEN_BITS, &g);
glGetIntegerv(GL_BLUE_BITS, &b);
glGetIntegerv(GL_ALPHA_BITS, &a);
printf("channel sizes: %d %d %d %d\n", r, g, b, a);

glEnable(GL_DEPTH_TEST);


glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0, 0.0, -1.0); 

// draw a plane
glBegin(GL_QUADS);
glColor3f(0.5f, 0.56789f, 0.568f);
glVertex3f(-1, -1, 0);
glVertex3f(-1, 1, 0);
glVertex3f(1, 1, 0);
glVertex3f(1, -1, 0);
glEnd();

glFinish();
}

int main( int argc, char *argv[] )
{
GLfloat *buffer;

/* Create an RGBA-mode context */
#if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305
/* specify Z, stencil, accum sizes */
OSMesaContext ctx = OSMesaCreateContextExt( GL_RGB, 16, 0, 0, NULL );
#else
OSMesaContext ctx = OSMesaCreateContext( GL_RGB, NULL );
#endif
if (!ctx) {
    printf("OSMesaCreateContext failed!\n");
    return 0;
}

/* Allocate the image buffer */
buffer = (GLfloat *) malloc( WIDTH * HEIGHT * 3 * sizeof(GLfloat));
if (!buffer) {
    printf("Alloc image buffer failed!\n");
    return 0;
}

/* Bind the buffer to the context and make it current */
if (!OSMesaMakeCurrent( ctx, buffer, GL_FLOAT, WIDTH, HEIGHT )) {
      printf("OSMesaMakeCurrent failed!\n");
      return 0;
}

draw();

printf("RED: %f\n", buffer[0]);
printf("GREEN: %f\n", buffer[1]);
printf("BLUE: %f\n", buffer[2]);

/* free the image buffer */
free( buffer );

/* destroy the context */
OSMesaDestroyContext( ctx );

return 0;
}

図面コードでは、次の行があります。

glColor3f(0.5f, 0.56789f, 0.568f);

フローティングカラー値を教えてください。色を読むと、次の出力が得られます。

channel sizes: 32 32 32 32
RED: 0.501961
GREEN: 0.568627
BLUE: 0.568627

そして、0.501961 = 128/255、および0.568627 = 145/255(つまり量子化)であることがわかります。

Macで次の構成を使用してMesaをビルドしました。

./configure --with-driver=osmesa --with-osmesa-bits=32 --disable-gallium --disable-egl
4

2 に答える 2

1

イミディエイトモードの代わりにシェーダーと頂点属性を使用してみてください。glColor3fが受け取ったものを8ビットに量子化しないという保証はありません。「実際の」OpenGLにもそのような保証が存在するかどうかはわかりません。私が知る限り、glspec41との互換性は色の精度を維持することについては何も述べていませんが、「精度が制限されているため、一部の変換された値は正確に表されません。」(2.13:固定機能の頂点のライティングとカラーリング)。

于 2012-05-01T13:39:36.947 に答える
0

これはコンパイルの問題です。s_span.cでは、CHAN_TYPE(mtypes.hで定義)の値に基づいたGLubyteへの変換を確認できます。

すべてがCHAN_BITS==32になるか、config.hに含まれません。

あなたの投稿で、32ビットに設定しているとおっしゃっていますが、おそらくさまざまなビルドで作業しています。WindowsではOSMesaを使用していますが、そうではないようです。


私は7.5.1を使用しています-VS.slnを備えた最後のMesaのようです。

チャネルビットを32に設定すると、OSMESAは失敗します。何か見つけたら教えてください。

ありがとう!

于 2012-05-02T02:08:32.813 に答える