查看: 1246|回复: 10

OpenGL程序转为OSG代码。。有什么好思路没?。。。

[复制链接]

该用户从未签到

发表于 2014-5-19 13:35:24 | 显示全部楼层 |阅读模式
/*----------------------------------------------------*/
/* ibfv_sample.c - Image Based Flow Visualization     */
/*                                                    */
/* Jarke J. van Wijk, 2002                            */
/* Technische Universiteit Eindhoven                  */
/*----------------------------------------------------*/
#include "GL/glut.h"
#include <stdlib.h>
#include <math.h>

#define        NPN 64
#define NMESH  100
#define DM  ((float) (1.0/(NMESH-1.0)))
#define NPIX  512
#define SCALE 4.0

int    iframe = 0;
int    Npat   = 32;
int    alpha  = (0.12*255);
float  sa;
float  tmax   = NPIX/(SCALE*NPN);
float  dmax   = SCALE/NPIX;
/*----------------------------------------------------*/
void initGL(void)
{
   glViewport(0, 0, (GLsizei) NPIX, (GLsizei) NPIX);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glTranslatef(-1.0, -1.0, 0.0);
   glScalef(2.0, 2.0, 1.0);
   glTexParameteri(GL_TEXTURE_2D,
                   GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D,
                   GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D,
                   GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,
                   GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexEnvf(GL_TEXTURE_ENV,
                   GL_TEXTURE_ENV_MODE, GL_REPLACE);
   glEnable(GL_TEXTURE_2D);
   glShadeModel(GL_FLAT);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//SRC_ALPHA 表示使用源颜色的alpha值来作为因子。ONE_MINUS_SRC_ALPHA 表示用1.0减去源颜色的alpha值来作为因子。
   glClear(GL_COLOR_BUFFER_BIT);
}
/*----------------------------------------------------*/
void makePatterns(void)
{
   int lut[256];
   int phase[NPN][NPN];
   GLubyte pat[NPN][NPN][4];
   int i, j, k, t;
   
   for (i = 0; i < 256; i++) lut[i] = i < 127 ? 0 : 255;
   for (i = 0; i < NPN; i++)
   for (j = 0; j < NPN; j++) phase[i][j] = rand() % 256;

   for (k = 0; k < Npat; k++) {
      t = k*256/Npat;
      for (i = 0; i < NPN; i++)
      for (j = 0; j < NPN; j++) {
          pat[i][j][0] =
          pat[i][j][1] =
          pat[i][j][2] = lut[(t + phase[i][j]) % 255];
          pat[i][j][3] = alpha;
      }
      glNewList(k + 1, GL_COMPILE);
      glTexImage2D(GL_TEXTURE_2D, 0, 4, NPN, NPN, 0,
                   GL_RGBA, GL_UNSIGNED_BYTE, pat);
      glEndList();
   }
}
/*----------------------------------------------------*/
void getDP(float x, float y, float *px, float *py)
{
   float dx, dy, vx, vy, r;

   dx = x - 0.5;         
   dy = y - 0.5;
   r  = dx*dx + dy*dy;
   if (r < 0.0001) r = 0.0001;
   vx = sa*dx/r + 0.02;  
   vy = sa*dy/r;
   r  = vx*vx + vy*vy;
   if (r > dmax*dmax) {
      r  = sqrt(r);
      vx *= dmax/r;
      vy *= dmax/r;
   }
   *px = x + vx;         
   *py = y + vy;
}
/*----------------------------------------------------*/
void display(void)
{
   int   i, j;
   float x1, x2, y, px, py;

   sa = 0.010*cos(iframe*2.0*M_PI/200.0);
   for (i = 0; i < NMESH-1; i++) {
      x1 = DM*i; x2 = x1 + DM;
      glBegin(GL_QUAD_STRIP);
      for (j = 0; j < NMESH; j++) {
          y = DM*j;
          glTexCoord2f(x1, y);
          getDP(x1, y, &px, &py);
          glVertex2f(px, py);

          glTexCoord2f(x2, y);
          getDP(x2, y, &px, &py);
          glVertex2f(px, py);
      }
      glEnd();
   }
   iframe = iframe + 1;

   glEnable(GL_BLEND);
   glCallList(iframe % Npat + 1);
   glBegin(GL_QUAD_STRIP);
      glTexCoord2f(0.0,  0.0);  glVertex2f(0.0, 0.0);
      glTexCoord2f(0.0,  tmax); glVertex2f(0.0, 1.0);
      glTexCoord2f(tmax, 0.0);  glVertex2f(1.0, 0.0);
      glTexCoord2f(tmax, tmax); glVertex2f(1.0, 1.0);
   glEnd();
   glDisable(GL_BLEND);
   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
                    0, 0, NPIX, NPIX, 0);
   glutSwapBuffers();
}
/*----------------------------------------------------*/
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize(NPIX, NPIX);
   glutCreateWindow(argv[0]);
   glutDisplayFunc(display);
   glutIdleFunc(display);
   initGL();
   makePatterns();
   glutMainLoop();
   return 0;
}

该用户从未签到

 楼主| 发表于 2014-5-19 13:35:51 | 显示全部楼层
各位。。。。。。。求指导。

该用户从未签到

发表于 2014-5-20 18:56:10 | 显示全部楼层
楼主学过编译原理没?我绝得必须得建立在那个基础之上还要懂很多才能写出这样的程序!

该用户从未签到

 楼主| 发表于 2014-5-21 11:15:02 | 显示全部楼层
寻灿者 发表于 2014-5-20 18:56
楼主学过编译原理没?我绝得必须得建立在那个基础之上还要懂很多才能写出这样的程序!

没学过。。需要那么高深的知识?从应用角度上,我差不多能读懂这个程序,但是有些操作不知道在OSG里如何实现。尝试修改但是没有出来原来的效果,可能是这里面的一些机制没搞明白。求指导,,,。。。。

该用户从未签到

发表于 2014-5-22 18:42:21 | 显示全部楼层
hczhang 发表于 2014-5-21 11:15
没学过。。需要那么高深的知识?从应用角度上,我差不多能读懂这个程序,但是有些操作不知道在OSG里如何 ...

绘制几何体使用geometry,纹理贴图使用texture2d,纹理环境和过滤器之类的属于stateSet属性设置。可以构建一个geometry对象,给出几何顶点数据,法线,纹理坐标,设置纹理的话,使用texture2d,这个对象接受一个image(加载图片)。都可以在geometry对象上做这些设置,然后构建一个geoNode节点,交给osgViewer进行显示就行了。

该用户从未签到

 楼主| 发表于 2014-5-22 19:25:38 | 显示全部楼层
ysw 发表于 2014-5-22 18:42
绘制几何体使用geometry,纹理贴图使用texture2d,纹理环境和过滤器之类的属于stateSet属性设置。可以构建 ...

谢谢你的回答,我主要的问题是卡在纹理动态混合及动态对顶点坐标的更改上。。

该用户从未签到

 楼主| 发表于 2014-5-23 10:18:53 | 显示全部楼层
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, NPIX, NPIX, 0);在OSG里如何实现?

该用户从未签到

发表于 2014-5-23 17:17:31 | 显示全部楼层
hczhang 发表于 2014-5-21 11:15
没学过。。需要那么高深的知识?从应用角度上,我差不多能读懂这个程序,但是有些操作不知道在OSG里如何 ...

    我以为你是要做一个能自动转换的程序。。。。。。。。。

该用户从未签到

发表于 2014-5-24 10:00:50 | 显示全部楼层
hczhang 发表于 2014-5-23 10:18
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, NPIX, NPIX, 0);在OSG里如何实现?

osg/Texture2D里面有copyTexImage2D,你可以看下

该用户从未签到

 楼主| 发表于 2014-5-25 08:20:30 | 显示全部楼层
ysw 发表于 2014-5-24 10:00
osg/Texture2D里面有copyTexImage2D,你可以看下

看到了,但是里面那个state参数知道怎么处理。。。。。

该用户从未签到

发表于 2014-5-29 10:53:10 | 显示全部楼层
要转osg,首先把osg弄明白了,相信根本不是什么难事
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表