当我尝试在 OpenGL 中使用 RGBA 颜色绘制二维圆时,它使用最接近的 16 色调色板颜色绘制它。这是我使用的代码。
// Init canvas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,Screen.Width(),Screen.Height(),0,0,1);
glMatrixMode(GL_MODELVIEW);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
// Background
glClearColor(0.0,0.0,0.0,1.0);
glShadeModel(GL_SMOOTH);
glClear(GL_COLOR_BUFFER_BIT);
[...]
glColor3f(Color.R,Color.G,Color.B);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(Pos.X - SX,Pos.Y - SY);
for (int angle=0; angle <= 360; angle+=1)
glVertex2f(Pos.X - SX + sin(angle*M_PI/180.0) * Size, Pos.Y - SY + cos(angle*M_PI/180.0) * Size);
glEnd();
[...]
// Render
glFlush();
glDisable(GL_COLOR_MATERIAL);
Color 是 Color 类型的结构:
struct Color
{
float R;
float G;
float B;
float A;
void operator =(Color Clr);
bool operator ==(Color Clr);
};
以下代码用于设置引擎:
// Create context
GDC = GetDC(Handle);
// Create pixel format descriptor
PIXELFORMATDESCRIPTOR GPFD = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,
0,0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
GPixelFormat = ChoosePixelFormat(GDC,&GPFD);
SetPixelFormat(GDC,GPixelFormat,&GPFD);
// Create resource
GRC = wglCreateContext(GDC);
wglMakeCurrent(GDC,GRC);
// Setup resource
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
我做错了什么?
更新:
当我调试此代码并使用 DescribePixelFormat() 读取像素格式时,调试器输出以下内容:https://dl.dropboxusercontent.com/u/12669217/Debugger.jpg
此外,未设置标志 PFD_GENERIC_FORMAT 和 PFD_NEED_PALETTE。
这是所需的输出(在我使用 OpenGL 之前):https://dl.dropboxusercontent.com/u/12669217/CR_Desired.png
这是实际输出(文本和背景尚未实现):https://dl.dropboxusercontent.com/u/12669217/CR_Actual.png
最佳答案
在 WGL 中,像素格式描述符 PFD_TYPE_RGBA 将为您提供使用位平面 的像素格式。使用 RGBA 时没有调色板,但是,此模式取决于您为每个平面分配的位数和任何移位。
我建议使用:
PIXELFORMATDESCRIPTOR GPFD = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0, // No Shift Bits or Arbitrary Bitplane Allocation
0,0,
0,0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
我怀疑移位位字段是造成您异常行为的原因。如果您异常地设置了太多这些值,您将得到一个不是硬件加速的像素格式。例如,许多硬件不支持 32 位 z 缓冲区(24 位 Z + 8 位模板更兼容)。
您应该真正做的是在选择您的像素格式并查看 WGL 实际为您提供的内容后调用 DescribePixelFormat (...)。 WGL 搜索与您请求的格式最匹配的像素格式。
查看 ChoosePixelFormat 的引用资料, 在 MSDN 上。它声明如下:
Remarks
You must ensure that the pixel format matched by the ChoosePixelFormat function satisfies your requirements. For example, if you request a pixel format with a 24-bit RGB color buffer but the device context offers only 8-bit RGB color buffers, the function returns a pixel format with an 8-bit RGB color buffer.
更新:
将此代码添加到您的设置中,并在调试器中检查 GPFD 的数据结构:
DescribePixelFormat (GPixelFormat, &GPFD);
特别注意 cColorBits 和 cDepthBits 等字段。
您还应该检查几个标志,但调试器不会让这变得容易。在您的代码中,您应该测试:
GPFD.dwFlags & PFD_GENERIC_FORMATGPFD.dwFlags & PFD_NEED_PALETTE关于c++ - 改变RGBA颜色后OpenGL以16种颜色绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475417/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
如何使用Ruby的默认Curses库获取颜色?所以像这样:puts"\e[0m\e[30;47mtest\e[0m"效果很好。在浅灰色背景上呈现漂亮的黑色。但是这个:#!/usr/bin/envrubyrequire'curses'Curses.noecho#donotshowtypedkeysCurses.init_screenCurses.stdscr.keypad(true)#enablearrowkeys(forpageup/down)Curses.stdscr.nodelay=1Curses.clearCurses.setpos(0,0)Curses.addstr"Hello
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=