VS2008编译OSG 2.8.2

1.编译过程中会遇到错误,提示中不到ReaderWriterPNG.cpp文件中的png_set_gray_1_2_4_to_8()函数,此处应将该函数改为png_set_expand_gray_1_2_4_to_8()。

如何让OSG 3.0.0支持Windows下生成的PLY文件

OSG使用Plugin PLY插件来完成PLY文件的读写。在OSG 3.0.0中,这个插件存在一个bug,即无法读取由Windows应用产生的PLY格式文件。

我们需要对“src\osgPlugins\ply\plyfile.cpp”文件进行一些修改,完成de-bug工作。具体说来就是将文件中的get_words()函数用下面的内容替换:

char **get_words(FILE *fp, int *nwords, char **orig_line)
{
	#define BIG_STRING 4096

	static char str[BIG_STRING];
	static char str_copy[BIG_STRING];
	char **words;
	int max_words = 10;
	int num_words = 0;
	char *ptr,*ptr2;
	char *result;
	fpos_t pos; //keep track of file pointer
	int nbytes;
	int nonUNIX;
	nonUNIX=0;
	nbytes=0;
	fgetpos(fp, &pos);

	words = (char **) myalloc (sizeof (char *) * max_words);

	/* read in a line */
	 result = fgets (str, BIG_STRING, fp);
	if (result == NULL) {
	*nwords = 0;
	*orig_line = NULL;
	return (NULL);
	}

	/* convert line-feed and tabs into spaces */
	/* (this guarentees that there will be a space before the */
	/*  null character at the end of the string) */

	str[BIG_STRING-2] = ' ';
	str[BIG_STRING-1] = '\0';

	for (ptr = str, ptr2 = str_copy; *ptr != '\0'; ptr++, ptr2++) {
		*ptr2 = *ptr;
		nbytes++;
		if (*ptr == '\t') {
			*ptr = ' ';
			*ptr2 = ' ';
		}
		else if (*ptr == '\n') {
			*ptr = ' '; //has to have a space, to be caught later when grouping words

			*ptr2 = '\0';
			break;
		}
		else if (*ptr == '\r')
		{	  //MAC line break
			nonUNIX=1;
			if(*(ptr+1)=='\n')		  //actuall PC line break
			{
				nbytes++;
			}

			*ptr = ' ';

			*(ptr+1) = '\0';	//when reading mac, best end string here
			*ptr2 = '\0'; 		//note a pc \r is followed by \n

			break;
		}
	}

  /* find the words in the line */

  ptr = str;
  while (*ptr != '\0') {

    /* jump over leading spaces */
    while (*ptr == ' ')
      ptr++;

    /* break if we reach the end */
    if (*ptr == '\0')
      break;

    /* save pointer to beginning of word */
    if (num_words >= max_words) {
      max_words += 10;
      words = (char **) realloc (words, sizeof (char *) * max_words);
    }
    words[num_words++] = ptr;

    /* jump over non-spaces */
    while (*ptr != ' ')
      ptr++;

    /* place a null character here to mark the end of the word */
    *ptr++ = '\0';
  }

  /* return the list of words */
  *nwords = num_words;
  *orig_line = str_copy;
  return (words);
}

如何让OSG支持更多的图像格式

我们知道,由默认的cmake选项创建MSVS工程,编译得到的OSG是不支持jpeg,png,tiff,jpeg2000等图像格式的。这给我们进行带来了一些不便(如进行纹理映射时)。如何使OSG支持这些格式呢?其实很简单,只需在使用cmake创建MSVC工程时进行少量额外的设置即可。具体流程如下:
  1. 下载OSG-3.0.0源代码。
  2. 下载libjpeg libpng libtiff zlib库备用(头文件&lib文件),并将其头文件,库文件路径添加到VS2008路径中。
  3. 配置cmake选项。
    • 勾选在advanced,显示高级选项。
    • 根据步骤2中文件的路径,设置JPEG_INCLUDE_DIR, JPEG_LIBARARY,  PNG_PNG_INCLUDE_DIR, PNG_LIBRARY, TIFF_INCLUDE_DIR, TIFF_LIBRARY, ZLIB_INCLUDE_DIR, ZLIB_LIBRARY,以完成OSG对jpeg, png, tiff图像文件格式的支持。
  4. 生成VC9.0工程。
  5. 打开OSG工程,在子工程中添加依赖库。
    • Plugins tiff,依赖库: zlib.lib,libtiff。
    • osg DB,依赖库: zlib。
    • Plugins jpeg,依赖库:libjpeg.lib。
    • Plugins png,依赖库:zlib.lib,libpng.lib。
    • Plugins ive:,依赖库:zlib.lib。
    • Plugins gz,依赖库: zlib.lib。
    • Plugins jp2,依赖库: libjasper.lib ,忽略库:LIBCMT(D).LIB(与MSVCRTD.lib冲突)。
  6. 编译工程即可。