Creating Anaglyphs using OpenGL

本文介绍如何利用OpenGL和累积缓冲区来创建立体图像(anaglyphs),即使在没有立体显示支持的硬件上也能实现立体效果。文章提供了实现步骤,包括初始化累积缓冲区、设置颜色过滤等,并提供了一个示例程序。

Creating Anaglyphs using OpenGL

or

A simple example using the OpenGL accumulation buffer

Written by Paul Bourke

August 2000

See also:
Correctly forming stereo pairs
Further anaglyph examples

 


 

Introduction
Would you like to experiment with interactive stereographics but your graphics card doesn't support stereographics or even left and right buffers? Have you lost or never had a pair of LCD shutter glasses and don't want to pay for a pair? The following shows how to create anaglyphs using OpenGL and the accumulation buffer. It supports all the major filter colours and illustrates how to correctly form stereo pairs. A number of simple geometric forms are supplied to illustrate the principle, it should be a very simple task to add other models and provide more sophisticated interaction. While anaglyphs are somewhat the "old fashioned" way of creating stereographic images, they are still effective, even if they are limited to monochromatic images.

Approach

Stereographics primarily requires that two images (one for each eye) are presented independently to our two eyes. If these two views of a 3D model are computed correctly the human brain will fuse them and give us a stronger depth perception than we normally get with a single image There are a number of ways this can be achieved, this document deals with anaglyphs in which the left and right eye images are made up of two independent colours. By wearing glasses with matching filters, the left eye image is delivered to the left eye and the right eye image to the right eye.

Whatever technique is used, the scene needs to be rendered twice, once for each eye position. The two resulting images need to be filtered and combined before being presented to the user. The two images are most conveniently added together by using the accumulation buffer. There are only a small number of things that need to be changed to an existing OpenGL program in order for it to support anaglyphs, these are outlined below.

 

  • Initialise the accumulation buffer in glut, for example:
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_ACCUM | GLUT_RGB | GLUT_DEPTH);

     

  • Set the clear colour for the accumulation buffer (black as used here is the default), for example:
    glClearAccum(0.0,0.0,0.0,0.0);

  • Clear the accumulation buffer when necessary
    glClear(GL_ACCUM_BUFFER_BIT);

     

  • Copy the current drawing buffer to the accumulation buffer. This would normally be done after the left eye image has been drawn. Note: strictly speaking if GL_LOAD is used then it isn't necessary to clear the accumulation buffer beforehand.
    glAccum(GL_LOAD,1.0);

  • Add the current drawing buffer to the accumulation buffer. This would normally done after the right eye image has been drawn.
    glAccum(GL_ACCUM,1.0);

  • Copy the accumulation buffer to the current drawing buffer. After this the current drawing buffer (back buffer say) would be swapped to the front buffer.
    glAccum(GL_RETURN,1.0);

  • The glAccum() functions act upon the current read and write buffers, for example these might be set as follows:
    glDrawBuffer(GL_BACK);
    glReadBuffer(GL_BACK);

In order to draw the left and right eye scene in the appropriate colour for the filters in the glasses, one could specify one colour when drawing the left eye image and another for the right eye image. This is a bit clumsy, a much easier way is to only specify colours in the scene as different shades of grey and apply glColorMask() to do the filtering automatically. For more details on the whole process see the source code.

Source code
anaglyph.c and anaglyph.h

 

Example models
The window shots on the right show the different 3D models available in the demo application (right mouse button for menus). For examples using different colour filters you will need to get and compile the software. The software as it is provided supports the three most common types of anaglyph glasses, that is, red-blue, red-green, and red-cyan. The last type has the extra advantage that where the objects intersect they form a greyscale image which is easier to look at and appreciate without glasses a well as resulting in less ghosting with glasses.

 

 


Feedback from Michael Callahan

If you're rendering with the hardware red and blue (for example, using color masks), then the colors do not overlap at all. So if you aren't already using the blend function for something else, the accumulation buffer is unnecessary:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
    
    // set camera for blue eye, red will be filtered.
    
    // draw scene
    
    glClear(GL_DEPTH_BUFFER_BIT);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);
    
    glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE);
    
    // set camera for red eye, blue will be filtered.
    
    // draw scene

Feedback from Daniel van Vugt

Daniel van Vugt pointed out that the accumulation buffer isn't actually needed resulting in a much faster implementation.

 

"Because the two images do not overlap in colour space, no kind of blending or accumulation is actually doing anything. Just remember to clear the depth buffer for each image, but don't clear the colour buffer between the two images."

New, faster, source code
下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值