PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Floating Point Texturen unter OpenGL


pajofego
2004-05-14, 12:00:46
Hallo Leute habe folgende Textur unter OpenGL mit Nvidia Extension versucht zu erstellen:

glTexImage2D(GL_TEXTURE_2D, 0, GL_FLOAT_RGBA32_NV, FSizeX, FSizeY, 0, GL_RGBA, GL_FLOAT, 0);

Nachdem ich diese Textur mit einem Cg Shader bearbeitet habe, möchte ich dessen Inhalt auslesen und versuche dies mit folgendem Code:

glBindTexture(GL_TEXTURE_2D, FIntTexture);

glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, PixelArray);

printf("%f\n", PixelArray[i][j][k]);

1. Geht es nicht, ich bekommen nur lauter Nuller raus, obwohl da echte Gleitkommawerte stehen müssten.
2. Wenn ich anstatt der Nvidia Extension die GL_RGBA benutze clampt er mir die Werte auf [0,1].
Ich brauche aber unbedingt Werte die über diesen Bereicht gehen. Weiss jemand wie das geht?

Danke

Corrail
2004-05-14, 13:32:59
NV floating point texturen funktionieren nur auf GL_TEXTURE_RECTANGLE_NV/EXT Texture Targets, nicht auf GL_TEXTURE_2D.

pajofego
2004-05-14, 13:48:29
O.K. Ich habe dann einmal meinen code geändert. Problem ist jetzt, da stehen nur noch lauter Nuller drinnen. Vorher waren noch Wert zw. 0 und 1. Habe ich da jetzt etwas falsch verstanden?

virtual bool Init()
{
if (LoadCgProgram() != true)
return false;
else
{
glGenTextures(1, &FIntTexture);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, FSizeX, FSizeY, 0, GL_RGBA, GL_FLOAT, 0);
glEnable(GL_TEXTURE_RECTANGLE_NV);
}
return true;
};


virtual void GetPixels(int i,int j, int k)
{
glBindTexture(GL_TEXTURE_2D, this->FIntTexture);
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_FLOAT, PixelArray);
printf("%f\n", PixelArray[i][j][k]);
};

MeLLe
2004-05-14, 13:53:45
Original geschrieben von pajofego
O.K. Ich habe dann einmal meinen code geändert. Problem ist jetzt, da stehen nur noch lauter Nuller drinnen. Vorher waren noch Wert zw. 0 und 1. Habe ich da jetzt etwas falsch verstanden?

virtual bool Init()
{
if (LoadCgProgram() != true)
return false;
else
{
glGenTextures(1, &FIntTexture);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, FSizeX, FSizeY, 0, GL_RGBA, GL_FLOAT, 0);
glEnable(GL_TEXTURE_RECTANGLE_NV);
}
return true;
};


virtual void GetPixels(int i,int j, int k)
{
glBindTexture(GL_TEXTURE_RECTANGLE_NV, this->FIntTexture);
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_FLOAT, PixelArray);
printf("%f\n", PixelArray[i][j][k]);
};
Wie wär's damit??

Corrail
2004-05-14, 13:54:13
Das sollte soweit passen. Da du beim Aufruf von glTexImage2D OpenGL keine Daten lieferst sondern nur einen NULL Pointer wird nur der Speicherplatz für die Textur reserviert. Ich weiß aber nicht welche Werte die Pixel dann standartmäßig haben. Kann schon sein, dass das so stimmt.

pajofego
2004-05-14, 14:26:40
Gut jetzt habe ich zwar alles so geändert wie ihr es vorgeschlagen habt, jedoch erwarte ich das in der Textur die Werte aus dem Cg Shader drin stehen. Ich habe ein Cg shader welches als Output lediglich return float4(2.2, 2.3, 3.5, 1.5) rausgibt. Ich wollte lediglich mit diesem Code testen ob sich floating points in texturen abspeichern lassen und diese dann rauslesen. Leider bekomme ich halt nur immer die nuller heraus.

Danke

Hier der ganze source meiner Klasse:

#pragma once

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <gl/glew.h>
#include <cg/cgGL.h>
#include <Cg/cg.h>
#include <math.h>

#define M_PI 3.14159265358979323846
static GLfloat PixelArray[512][512][4];

class clCgBasis{
public:
clCgBasis(void)
{
};

clCgBasis(int SizeX, int SizeY, CGprofile Profile, CGcontext Context, const char *FileName)
{
FSizeX = SizeX;
FSizeY = SizeY;
FFileName = FileName;
FIntTexture = 0;
FContext = Context;
FProfile = Profile;
FTxtParam = NULL;
FragmentProgram = NULL;

if (Init() != true)
printf("Error during calling 'Init()' in class clCgBasis\n");
};

virtual ~clCgBasis(void)
{
cgDestroyProgram(FragmentProgram);
};
// abstract methods must be inherited by descendent class!
virtual bool Update(void)
{
// Bind the filtered texture
glBindTexture(GL_TEXTURE_RECTANGLE_NV, this->FIntTexture);
glEnable(GL_TEXTURE_RECTANGLE_NV);

// render a full-screen quad textured with the results of our
// computation. Note that this is not part of the computation: this
// is only the visualization of the results.
glBegin(GL_QUADS);
{
glTexCoord2f(0, 0); glVertex3f(-1, -1, -0.5f);
glTexCoord2f(1, 0); glVertex3f( 1, -1, -0.5f);
glTexCoord2f(1, 1); glVertex3f( 1, 1, -0.5f);
glTexCoord2f(0, 1); glVertex3f(-1, 1, -0.5f);
}
glEnd();

glDisable(GL_TEXTURE_RECTANGLE_NV);
return true;
};

virtual bool Display(void)
{
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glViewport(0, 0, this->FSizeX, this->FSizeY);

glBindTexture(GL_TEXTURE_RECTANGLE_NV, this->FIntTexture);
glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, 0, 0, this->FSizeX, this->FSizeY);

cgGLBindProgram(this->FragmentProgram);
cgGLEnableProfile(this->FProfile);


cgGLSetTextureParameter(this->FTxtParam, this->FIntTexture);
cgGLEnableTextureParameter(this->FTxtParam);

glBegin(GL_QUADS);
{
glTexCoord2f(0, 0); glVertex3f(-1, -1, -0.5f);
glTexCoord2f(1, 0); glVertex3f( 1, -1, -0.5f);
glTexCoord2f(1, 1); glVertex3f( 1, 1, -0.5f);
glTexCoord2f(0, 1); glVertex3f(-1, 1, -0.5f);
}
glEnd();

cgGLDisableTextureParameter(this->FTxtParam);
cgGLDisableProfile(this->FProfile);

glBindTexture(GL_TEXTURE_RECTANGLE_NV, this->FIntTexture);
glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, 0, 0, this->FSizeX, this->FSizeY);

glViewport(vp[0], vp[1], vp[2], vp[3]);
return true;
};

virtual unsigned int GetTexture(){return FIntTexture;};
virtual CGcontext GetContext(){return FContext;};
virtual CGprofile GetProfile(){return FProfile;};
virtual void GetPixels(int i,int j, int k)
{
glBindTexture(GL_TEXTURE_RECTANGLE_NV, this->FIntTexture);
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_FLOAT, PixelArray);
printf("%f\n", PixelArray[i][j][k]);
}

protected:
virtual bool LoadCgProgram()
{
FragmentProgram = cgCreateProgramFromFile(FContext, CG_SOURCE,
FFileName, FProfile,
NULL, NULL);
if(FragmentProgram != NULL)
{
cgGLLoadProgram(FragmentProgram);
FTxtParam = cgGetNamedParameter(FragmentProgram, "texture");
return true;
}
return false;
};

virtual bool Init()
{
if (LoadCgProgram() != true)
return false;
else
{
glGenTextures(1, &FIntTexture);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, FSizeX, FSizeY, 0, GL_RGBA, GL_FLOAT, NULL);
glEnable(GL_TEXTURE_RECTANGLE_NV);

return true;
}
};

CGprogram FragmentProgram; // the fragment program used to update
CGparameter FTxtParam; // a parameter to the fragment program
CGprofile FProfile;
CGcontext FContext;
int FSizeX;
int FSizeY;
unsigned int FIntTexture; // The texture used as a data array

private:
const char *FFileName;
};

Xmas
2004-05-14, 15:41:52
Ich bin zwar jetzt zu faul den Code durchzuwühlen ;), aber ich kann dir sagen dass das so nicht gehen kann. glCopyTexSubImage2D liest den Inhalt des Framebuffers, und da bekommst du auf GeForceFX maximal 8 Bit pro Kanal. Funktionieren kann das nur mit FP-Pbuffer.

pajofego
2004-05-14, 15:47:19
Ahhhhhhhh,

pBuffer! Das ist mir ein Begriff. Habe nur noch keine Ahnung wie ich das machen soll. Kannst du mir da mal eine kleine Hilfestellung geben?

pajofego
2004-05-14, 18:12:37
Ein paar Stunden später...

Habe es geschafft, dank pBuffer:D

Danke an alle, ist wirklich das beste Forum in Sachen Grafik!!!