// TODO : a templated initTF function for different kinds of tf ( float, short, etc ) void RayCastRenderer::initTransferFunction( const TransferFunction1D< uint8_t >& transferFunction ) { const UInt8Vector& transferFunctionData = transferFunction.getData(); assert( transferFunction.getNumChannels() == 4u ); if( transferFunctionTexture_ == 0 ) { GLuint tfTexture = 0; glGenTextures( 1, &tfTexture ); glBindTexture( GL_TEXTURE_1D, tfTexture ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glBindTexture( GL_TEXTURE_1D, tfTexture); glTexImage1D( GL_TEXTURE_1D, 0, GL_RGBA, transferFunctionData.size( )/4u, 0, GL_RGBA, GL_UNSIGNED_BYTE, &transferFunctionData[ 0 ] ); transferFunctionTexture_ = tfTexture; } else { glBindTexture( GL_TEXTURE_1D, transferFunctionTexture_ ); glTexImage1D( GL_TEXTURE_1D, 0, GL_RGBA, transferFunctionData.size( )/4u, 0, GL_RGBA, GL_UNSIGNED_BYTE, &transferFunctionData[ 0 ] ); } }
void initTransferFunction( const TransferFunction1D& transferFunction ) { assert( transferFunction.getNumChannels() == 4u ); if( _transferFunctionTexture == 0 ) { GLuint tfTexture = 0; glGenTextures( 1, &tfTexture ); glBindTexture( GL_TEXTURE_1D, tfTexture ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); _transferFunctionTexture = tfTexture; } glBindTexture( GL_TEXTURE_1D, _transferFunctionTexture ); const uint8_t* transferFunctionData = transferFunction.getLut(); glTexImage1D( GL_TEXTURE_1D, 0, GL_RGBA, GLsizei( transferFunction.getLutSize() / 4u ), 0, GL_RGBA, GL_UNSIGNED_BYTE, transferFunctionData ); }