拾取之检查颜色

Picking Tutorial
拾取教程


Cheking the Color
检查颜色


Checking the color of the pixel where the mouse was clicked involves reading that same pixel from the back buffer. This can be accomplished using the following function: 

检查从后缓冲区内读取鼠标点击位置的像素的颜色。它能名使用以下的函数来完成:



void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); 

Parameters:
x,y : the bottom left corner                                                                                                          x,y: 左下角的坐标 
width, length: the size of the area to be read                                                                              width, length: 将读取的区域大小
format: The type of data to be read. In here it is assumed to GL_RGB.                                     format: 将读取的数据类型。在这里我们将用GL_RGB.
type: the data type of the elements of the pixel. In here we'll use GL_UNSIGNED_BYTE.         type: 像素元素的数据类型。在这里我们将用GL_UNSIGNED_BYTE.
pixels: An array where the pixels will be stored. This is the result of the function                        pixels: 用来存储像素的数组。它将是这个函数的结果。


Both format and type have a lot of other possibilities, check the Red or Blue books for more information.

格式和类型有其它多种可能的值,检查红宝书来获取更多信息。

Just as when using the OpenGL API it is necessary to invert the y coordinate. Reading the viewport information is therefore also required when using this approach. After getting the viewport info, it is possible to call glReadPixels as shown in the code bellow. The x and y parameters represent the cursor position. Width and height are both set to one since only a single pixel is being read. Afterwards it is just a matter of checking the values of the pixel. 

只是使用OpenGL API时,需要翻转y的坐标。当使用这种方法时,读取视口信息也是必须的。在得到视口信息之后,就可以像下面展示的一样来调用glReadPixels。x和y参数代表鼠标的位置。Width和Height被设置成1,因为只有一个像素被读取。以后就只是检查像素的值的事情了。



    
void processPick ()
{
	GLint viewport[4];
	GLubyte pixel[3];

	glGetIntegerv(GL_VIEWPORT,viewport);

	glReadPixels(cursorX,viewport[3]-cursorY,1,1,
		GL_RGB,GL_UNSIGNED_BYTE,(void *)pixel);

	printf("%d %d %d\n",pixel[0],pixel[1],pixel[2]);
	if (pixel[0] == 255)
	  printf ("You picked the 1st snowman on the 1st row");
	else if (pixel[1] == 255)
	  printf ("You picked the 1st snowman on the 2nd row");
	else if (pixel[2] == 255)
	  printf ("You picked the 2nd snowman on the 1st row");
	else if (pixel[0] == 250)
	  printf ("You picked the 2nd snowman on the 2nd row");
   	else
	   printf("You didn't click a snowman!");
  printf ("\n");
   
}



To get this approach running without problems there are a few things that you should be aware. First set your colors using unsigned bytes as opposed to floats. When in RGB mode there are only 256 possible values for each component, so when you set a color using floats OpenGL will pick the nearest color possible. Secondly make sure your monitor is set to True Color. Otherwise the color presented on screen is only an approximation to the required color and therefore when reading back the pixels there is a possibility that the values wont match with the set values. Finally make sure you disable dithering, lighting and texturing for the color coded rendering function, since any of these operations may change the original color.

要没有任意问题的使用这种方法,你有一些事情应该注意。第一就是使用unsigned bytes来设置你的颜色而不是使用浮点数。当在RGB模式时,对第一部分只有256种可能的值,所以你使用浮点数来设置颜色值,OpenGL将会可能的是近的颜色。第二是确保你的显示器被设置成True Color.否则显示在屏幕的颜色只是要求颜色的一种近似,因此当读回像素的值时,可能与设置的值不相符。最后,确保你在颜色编码绘制函数中禁用抖动(dither)、光照和纹理,因为任何这些操作都可能会改变原始的颜色。

If you really want to work with floats to set the color, or you can't guarantee that the monitor will be set to True Color then you can always to a test to check what the specified colors will look like when rendered.

如果你确实想用浮点数来设置颜色,或者你不能保证显示器被设置成True Color,你可以总是做一个测试来检查指定的颜色在绘制时将如果显示。

This approach requires that before your application starts you must render blocks of the requested colors and read them back using glReadPixels to get the real rendered colors. Store those colors in an array and use them instead of the colors you specified when rendering.

这种方法需要你的应用程序在启动时绘制一块要求的颜色然后使用glReadPixels读回来得到真实的绘制颜色。把那些颜色存到一个数组并使用它们来代表你在绘制时指定的颜色。

Be careful when choosing the colors though. If the values for each component are not set sufficiently apart then the may turn out to be the same color when rendered. For instance when setting the red component to 250, using unsigned bytes, with the monitor set to High Color instead of True Color, you actually get a red component of 255. This is because there are less possible values for each component when using only 16 bits to specify a color instead of 32 or 24. Check out the pixel packing values in the Red Book to find out about the possible combinations of bits for each component with 16 bits.

要小心的是,当选择颜色时,如果每个部分的值设置的不足够与其它部分都区分,它们可能在绘制时变得一样。例如,当使用unsigned byte 设置红色部分为250,显示器设置为High Color而不是True Color,你实际上得到的红色部分是255.这是因为当只使用16比特而不是32或24来指定一个颜色,每个部分的可能值变少了。检查红宝书中像素pack值来找到16比特时可能的颜色值。

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值