nm16.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. int kernelSize = 2;
  5. int halfKernelSize = 1;
  6. float readS16(istream& in)
  7. {
  8.     unsigned char c[2];
  9.     cin.read((char*) c, 2);
  10.     return (((short) c[0] << 8) | c[1]) * (1.0f / 65535.0f);
  11. }
  12. float* readRowS16(istream& in, int width)
  13. {
  14.     float* row = new float[width];
  15.     for (int i = 0; i < width; i++)
  16.         row[i] = readS16(in);
  17.     return row;
  18. }
  19. int main(int argc, char* argv[])
  20. {
  21.     if (argc < 5)
  22.     {
  23.         cerr << "Usage: nm16 <width> <height> <bumpheight> <filter method>n";
  24.         return 1;
  25.     }
  26.     int width = 0;
  27.     int height = 0;
  28.     float bumpheight = 1.0f;
  29.     int method = 0;
  30.     if (sscanf(argv[1], " %d", &width) != 1 ||
  31.         sscanf(argv[2], " %d", &height) != 1)
  32.     {
  33.         cerr << "Bad image dimensions.n";
  34.         return 1;
  35.     }
  36.     if (sscanf(argv[3], " %f", &bumpheight) != 1)
  37.     {
  38.         cerr << "Invalid bump height.n";
  39.         return 1;
  40.     }
  41.     if (sscanf(argv[4], " %d", &method) != 1)
  42.     {
  43.         cerr << "Bad filter method.n";
  44.         return 1;
  45.     }
  46.     // Binary 8-bit grayscale header
  47.     // cout << "P5n";
  48.     // Binary 8-bit/channel RGB header
  49.     cout << "P6n";
  50.     cout << width << ' ' << height << 'n' << "255n";
  51.     float** samples = new float*[height];
  52.     for (int i = 0; i < kernelSize - 1; i++)
  53.         samples[i] = readRowS16(cin, width);
  54.     for (int y = 0; y < height; y++)
  55.     {
  56.         // Out with the old . . .
  57.         if (y > halfKernelSize)
  58.             delete[] samples[y - halfKernelSize - 1];
  59.         // . . . and in with the new.
  60.         if (y < height - halfKernelSize)
  61.             samples[y + halfKernelSize] = readRowS16(cin, width);
  62.         for (int x = 0; x < width; x++)
  63.         {
  64. #if 0
  65.             unsigned char v = (unsigned char) (samples[y][x]  * 255.99f);
  66.             cout.write((char*) &v, 1);
  67. #endif
  68.             float dx;
  69.             if (x == width - 1)
  70.                 dx = samples[y][0] - samples[y][x];
  71.             else
  72.                 dx = samples[y][x + 1] - samples[y][x];
  73.             float dy;
  74.             if (y == height - 1)
  75.                 dy = samples[y][x] - samples[y - 1][x];
  76.             else
  77.                 dy = samples[y + 1][x] - samples[y][x];
  78.         }
  79.     }
  80.     return 0;
  81. }