首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mesa3D: 32位通道在OSMesa32中不起作用

Mesa3D: 32位通道在OSMesa32中不起作用
EN

Stack Overflow用户
提问于 2012-05-01 19:00:08
回答 2查看 720关注 0票数 2

Mesa3D声称通过osmesa32支持32位浮点颜色通道。问题是,浮点数被量化为8位!还有没有人注意到这一点?下面是我用来测试的简短程序。你会看到我用一种特定的浮点颜色绘制了一个平面(占据了整个视图),然后读取第一个像素的颜色:

代码语言:javascript
复制
#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;
}

在绘图代码中,行:

代码语言:javascript
复制
glColor3f(0.5f, 0.56789f, 0.568f);

应该会给我浮动的颜色值。当我读取颜色时,我得到以下输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
./configure --with-driver=osmesa --with-osmesa-bits=32 --disable-gallium --disable-egl
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-02 10:08:33

这是一个编译问题。在s_span.c中,您可以看到基于GLubyte的值(在mtyes.h中定义)转换为CHAN_TYPE。

所有这些都归结为CHAN_BITS == 32或不是在config.h中。

我在你的帖子中看到你说你设置的是32位--但我们可能在使用不同的版本--我在Windows上使用OSMesa --看起来你可能不是。

我使用的是7.5.1版--似乎是最后一款带有VS.sln的台式电脑。

将通道位设置为32会导致OSMESA失败。如果你发现了什么,请告诉我。

谢谢!

票数 0
EN

Stack Overflow用户

发布于 2012-05-01 21:39:37

尝试使用着色器和顶点属性,而不是立即模式-不能保证glColor3f不会将接收到的任何内容量化为8位。我不确定这样的保证是否存在,即使在“真正的”OpenGL上-据我所知,GLSPEC41-兼容性并没有说任何关于保持颜色精度的内容,但它包含了一些有趣的段落,比如“由于有限的精度,一些转换的值将不会被准确地表示。”(2.13:固定功能顶点照明和着色)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10396771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档