cubemap support, work in progress.
This commit is contained in:
parent
0b05255f90
commit
86b43e55c1
@ -24,12 +24,11 @@ SET(NVTT_SRCS
|
|||||||
OutputOptions.h OutputOptions.cpp
|
OutputOptions.h OutputOptions.cpp
|
||||||
TaskDispatcher.h TaskDispatcher.cpp
|
TaskDispatcher.h TaskDispatcher.cpp
|
||||||
TexImage.h TexImage.cpp
|
TexImage.h TexImage.cpp
|
||||||
cuda/CudaUtils.h
|
CubeImage.h CubeImage.cpp
|
||||||
cuda/CudaUtils.cpp
|
cuda/CudaUtils.h cuda/CudaUtils.cpp
|
||||||
cuda/CudaMath.h
|
cuda/CudaMath.h
|
||||||
cuda/BitmapTable.h
|
cuda/BitmapTable.h
|
||||||
cuda/CudaCompressorDXT.h
|
cuda/CudaCompressorDXT.h cuda/CudaCompressorDXT.cpp)
|
||||||
cuda/CudaCompressorDXT.cpp)
|
|
||||||
|
|
||||||
IF (CUDA_FOUND)
|
IF (CUDA_FOUND)
|
||||||
ADD_DEFINITIONS(-DHAVE_CUDA)
|
ADD_DEFINITIONS(-DHAVE_CUDA)
|
||||||
|
126
src/nvtt/CubeImage.cpp
Normal file
126
src/nvtt/CubeImage.cpp
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
// Copyright (c) 2009-2011 Ignacio Castano <castano@gmail.com>
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person
|
||||||
|
// obtaining a copy of this software and associated documentation
|
||||||
|
// files (the "Software"), to deal in the Software without
|
||||||
|
// restriction, including without limitation the rights to use,
|
||||||
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the
|
||||||
|
// Software is furnished to do so, subject to the following
|
||||||
|
// conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
#include "CubeImage.h"
|
||||||
|
|
||||||
|
using namespace nv;
|
||||||
|
using namespace nvtt;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CubeImage::CubeImage() : m(new CubeImage::Private())
|
||||||
|
{
|
||||||
|
m->addRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
CubeImage::CubeImage(const CubeImage & cube) : m(cube.m)
|
||||||
|
{
|
||||||
|
if (m != NULL) m->addRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
CubeImage::~CubeImage()
|
||||||
|
{
|
||||||
|
if (m != NULL) m->release();
|
||||||
|
m = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CubeImage::operator=(const CubeImage & cube)
|
||||||
|
{
|
||||||
|
if (cube.m != NULL) cube.m->addRef();
|
||||||
|
if (m != NULL) m->release();
|
||||||
|
m = cube.m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CubeImage::detach()
|
||||||
|
{
|
||||||
|
if (m->refCount() > 1)
|
||||||
|
{
|
||||||
|
m->release();
|
||||||
|
m = new CubeImage::Private(*m);
|
||||||
|
m->addRef();
|
||||||
|
nvDebugCheck(m->refCount() == 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool CubeImage::isNull() const
|
||||||
|
{
|
||||||
|
return m->size == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CubeImage::size() const
|
||||||
|
{
|
||||||
|
return m->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CubeImage::countMipmaps() const
|
||||||
|
{
|
||||||
|
return nv::countMipmaps(m->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
TexImage & CubeImage::face(int f)
|
||||||
|
{
|
||||||
|
nvDebugCheck(f >= 0 && f < 6);
|
||||||
|
return m->face[f];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CubeImage::load(const char * fileName)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CubeImage::save(const char * fileName) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CubeImage::fold(const TexImage & tex, CubeLayout layout)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TexImage CubeImage::unfold(CubeLayout layout)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void CubeImage::toLinear(float gamma)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
m->face.toLinear(gamma);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CubeImage::toGamma(float gamma)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
m->face.toGamma(gamma);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
66
src/nvtt/CubeImage.h
Normal file
66
src/nvtt/CubeImage.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// Copyright (c) 2009-2011 Ignacio Castano <castano@gmail.com>
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person
|
||||||
|
// obtaining a copy of this software and associated documentation
|
||||||
|
// files (the "Software"), to deal in the Software without
|
||||||
|
// restriction, including without limitation the rights to use,
|
||||||
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the
|
||||||
|
// Software is furnished to do so, subject to the following
|
||||||
|
// conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
// OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
#ifndef NVTT_CUBEIMAGE_H
|
||||||
|
#define NVTT_CUBEIMAGE_H
|
||||||
|
|
||||||
|
#include "nvtt.h"
|
||||||
|
|
||||||
|
#include "nvcore/RefCounted.h"
|
||||||
|
#include "nvcore/Ptr.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nvtt
|
||||||
|
{
|
||||||
|
|
||||||
|
struct CubeImage::Private : public nv::RefCounted
|
||||||
|
{
|
||||||
|
void operator=(const Private &);
|
||||||
|
public:
|
||||||
|
Private()
|
||||||
|
{
|
||||||
|
nvDebugCheck( refCount() == 0 );
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
Private(const Private & p) : RefCounted() // Copy ctor. inits refcount to 0.
|
||||||
|
{
|
||||||
|
nvDebugCheck( refCount() == 0 );
|
||||||
|
|
||||||
|
size = p.size;
|
||||||
|
for (uint i = 0; i < 6; i++) {
|
||||||
|
face[i] = p.face[6];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~Private()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int size;
|
||||||
|
TexImage face[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
} // nvtt namespace
|
||||||
|
|
||||||
|
|
||||||
|
#endif // NVTT_CUBEIMAGE_H
|
@ -95,6 +95,18 @@ namespace
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint nv::countMipmaps(uint w)
|
||||||
|
{
|
||||||
|
uint mipmap = 0;
|
||||||
|
|
||||||
|
while (w != 1) {
|
||||||
|
w = max(1U, w / 2);
|
||||||
|
mipmap++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mipmap + 1;
|
||||||
|
}
|
||||||
|
|
||||||
uint nv::countMipmaps(uint w, uint h, uint d)
|
uint nv::countMipmaps(uint w, uint h, uint d)
|
||||||
{
|
{
|
||||||
uint mipmap = 0;
|
uint mipmap = 0;
|
||||||
@ -115,9 +127,7 @@ uint nv::computeImageSize(uint w, uint h, uint d, uint bitCount, uint pitchAlign
|
|||||||
return d * h * computeBytePitch(w, bitCount, pitchAlignmentInBytes);
|
return d * h * computeBytePitch(w, bitCount, pitchAlignmentInBytes);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
nvDebugCheck(d == 1);
|
return ((w + 3) / 4) * ((h + 3) / 4) * blockSize(format) * d;
|
||||||
// @@ Handle 3D textures. DXT and VTC have different behaviors.
|
|
||||||
return ((w + 3) / 4) * ((h + 3) / 4) * blockSize(format);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1118,6 +1128,8 @@ void TexImage::toRGBM(float range/*= 1*/, float threshold/*= 0.25*/)
|
|||||||
|
|
||||||
detach();
|
detach();
|
||||||
|
|
||||||
|
//threshold = clamp(threshold, 1e-6f, 1.0f);
|
||||||
|
threshold = 1e-6f;
|
||||||
float irange = 1.0f / range;
|
float irange = 1.0f / range;
|
||||||
|
|
||||||
FloatImage * img = m->image;
|
FloatImage * img = m->image;
|
||||||
@ -1131,13 +1143,51 @@ void TexImage::toRGBM(float range/*= 1*/, float threshold/*= 0.25*/)
|
|||||||
float R = nv::clamp(r[i] * irange, 0.0f, 1.0f);
|
float R = nv::clamp(r[i] * irange, 0.0f, 1.0f);
|
||||||
float G = nv::clamp(g[i] * irange, 0.0f, 1.0f);
|
float G = nv::clamp(g[i] * irange, 0.0f, 1.0f);
|
||||||
float B = nv::clamp(b[i] * irange, 0.0f, 1.0f);
|
float B = nv::clamp(b[i] * irange, 0.0f, 1.0f);
|
||||||
|
#if 1
|
||||||
float M = max(max(R, G), max(B, 1e-6f)); // Avoid division by zero.
|
float M = max(max(R, G), max(B, threshold));
|
||||||
|
|
||||||
r[i] = R / M;
|
r[i] = R / M;
|
||||||
g[i] = G / M;
|
g[i] = G / M;
|
||||||
b[i] = B / M;
|
b[i] = B / M;
|
||||||
a[i] = M;
|
a[i] = M;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// The optimal compressor theoretically produces the best results, but unfortunately introduces
|
||||||
|
// severe interpolation errors!
|
||||||
|
float bestM;
|
||||||
|
float bestError = FLT_MAX;
|
||||||
|
|
||||||
|
int minM = iround(min(R, G, B) * 255.0f);
|
||||||
|
|
||||||
|
for (int m = minM; m < 256; m++) {
|
||||||
|
float fm = float(m) / 255.0f;
|
||||||
|
|
||||||
|
// Encode.
|
||||||
|
int ir = iround(255.0f * nv::clamp(R / fm, 0.0f, 1.0f));
|
||||||
|
int ig = iround(255.0f * nv::clamp(G / fm, 0.0f, 1.0f));
|
||||||
|
int ib = iround(255.0f * nv::clamp(B / fm, 0.0f, 1.0f));
|
||||||
|
|
||||||
|
// Decode.
|
||||||
|
float fr = (float(ir) / 255.0f) * fm;
|
||||||
|
float fg = (float(ig) / 255.0f) * fm;
|
||||||
|
float fb = (float(ib) / 255.0f) * fm;
|
||||||
|
|
||||||
|
// Measure error.
|
||||||
|
float error = square(R-fr) + square(G-fg) + square(B-fb);
|
||||||
|
|
||||||
|
if (error < bestError) {
|
||||||
|
bestError = error;
|
||||||
|
bestM = fm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M = bestM;
|
||||||
|
r[i] = nv::clamp(R / M, 0.0f, 1.0f);
|
||||||
|
g[i] = nv::clamp(G / M, 0.0f, 1.0f);
|
||||||
|
b[i] = nv::clamp(B / M, 0.0f, 1.0f);
|
||||||
|
a[i] = M;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ namespace nvtt
|
|||||||
} // nvtt namespace
|
} // nvtt namespace
|
||||||
|
|
||||||
namespace nv {
|
namespace nv {
|
||||||
|
uint countMipmaps(uint w);
|
||||||
uint countMipmaps(uint w, uint h, uint d);
|
uint countMipmaps(uint w, uint h, uint d);
|
||||||
uint computeImageSize(uint w, uint h, uint d, uint bitCount, uint alignmentInBytes, nvtt::Format format);
|
uint computeImageSize(uint w, uint h, uint d, uint bitCount, uint alignmentInBytes, nvtt::Format format);
|
||||||
void getTargetExtent(int & w, int & h, int & d, int maxExtent, nvtt::RoundMode roundMode, nvtt::TextureType textureType);
|
void getTargetExtent(int & w, int & h, int & d, int maxExtent, nvtt::RoundMode roundMode, nvtt::TextureType textureType);
|
||||||
|
@ -507,7 +507,15 @@ namespace nvtt
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// A texture mipmap.
|
enum CubeLayout {
|
||||||
|
CubeLayout_VerticalCross,
|
||||||
|
CubeLayout_HorizontalCross,
|
||||||
|
CubeLayout_Column,
|
||||||
|
CubeLayout_Row,
|
||||||
|
CubeLayout_LatitudeLongitude,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// A cubemap mipmap.
|
||||||
struct CubeImage
|
struct CubeImage
|
||||||
{
|
{
|
||||||
NVTT_API CubeImage();
|
NVTT_API CubeImage();
|
||||||
@ -520,20 +528,24 @@ namespace nvtt
|
|||||||
NVTT_API bool isNull() const;
|
NVTT_API bool isNull() const;
|
||||||
NVTT_API int size() const;
|
NVTT_API int size() const;
|
||||||
NVTT_API int countMipmaps() const;
|
NVTT_API int countMipmaps() const;
|
||||||
NVTT_API float average(int channel, int alpha_channel = -1, float gamma = 2.2f) const;
|
|
||||||
|
|
||||||
// Texture data.
|
// Texture data.
|
||||||
NVTT_API bool load(const char * fileName);
|
NVTT_API bool load(const char * fileName);
|
||||||
NVTT_API bool save(const char * fileName) const;
|
NVTT_API bool save(const char * fileName) const;
|
||||||
NVTT_API bool setImage2D(InputFormat format, int face, int w, int h, const void * data);
|
|
||||||
NVTT_API bool setImage2D(InputFormat format, int face, int w, int h, const void * r, const void * g, const void * b, const void * a);
|
|
||||||
NVTT_API bool setImage2D(Format format, Decoder decoder, int face, int w, int h, const void * data);
|
|
||||||
|
|
||||||
TexImage & face(int face);
|
TexImage & face(int face);
|
||||||
|
|
||||||
//
|
// Layout conversion.
|
||||||
|
void fold(TexImage & img, CubeLayout layout);
|
||||||
|
TexImage unfold(CubeLayout layout);
|
||||||
|
|
||||||
|
// @@ Angular extent filtering.
|
||||||
|
|
||||||
// @@ Add resizing methods.
|
// @@ Add resizing methods.
|
||||||
|
|
||||||
|
// @@ Irradiance cubemaps.
|
||||||
|
CubeImage irradiance(int size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NVTT_API void resize(int w, int h, ResizeFilter filter);
|
NVTT_API void resize(int w, int h, ResizeFilter filter);
|
||||||
NVTT_API void resize(int w, int h, ResizeFilter filter, float filterWidth, const float * params = 0);
|
NVTT_API void resize(int w, int h, ResizeFilter filter, float filterWidth, const float * params = 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user