Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 21, 2025 08:58

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 17:57 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Hi again,

gleich vorweg, jetzt bin ich total verwirrt.

Ich habe das FBO wieder in meine Anwendung mit reingenommen.
Der Code wie er jetzt aussieht. (Init und render Methode, der Rest ist gleich wie in Post1):
Code:
  1.  
  2. void ShaderBlurMeanFilter::init(void) {
  3.     // Load texture from file
  4.     loadTexture("TmpTex1.bmp", &tmpTex1);
  5.     loadTexture("TmpTex2.bmp", &tmpTex2);
  6.  
  7.     std::string vertShaderSource;
  8.     std::string fragShaderSource;
  9.  
  10.     const char* tmpVertShaderSource;
  11.     const char* tmpFragShaderSource;
  12.  
  13.     GLint result = -1;
  14.     GLenum status;
  15.  
  16.     /* ****** *
  17.      * Pass 0 *
  18.      * ****** */
  19.     // Init vertex Shader
  20.     vertShaderPass0 = glCreateShader(GL_VERTEX_SHADER);
  21.     vertShaderSource = loadShader("Shader/Pass0.vert");
  22.     tmpVertShaderSource = vertShaderSource.c_str();
  23.     glShaderSourceARB(vertShaderPass0, 1, &tmpVertShaderSource, NULL);
  24.     glCompileShaderARB(vertShaderPass0);
  25.  
  26.     result = -1;
  27.     glGetShaderiv(vertShaderPass0, GL_COMPILE_STATUS, &result);
  28.     if(GL_FALSE == result) {
  29.         GLchar errorMessage[1024];
  30.         glGetShaderInfoLog(vertShaderPass0, 1024, NULL, errorMessage);
  31.         std::cout << "Can't compile vertex shader:" << errorMessage << std::endl;
  32.         exit(-1);
  33.     }
  34.  
  35.     // Init fragment Shader
  36.     fragShaderPass0 = glCreateShader(GL_FRAGMENT_SHADER);
  37.     fragShaderSource = loadShader("Shader/Pass0.frag");
  38.     tmpFragShaderSource = fragShaderSource.c_str();
  39.     glShaderSourceARB(fragShaderPass0, 1, &tmpFragShaderSource, NULL);
  40.     glCompileShaderARB(fragShaderPass0);
  41.  
  42.     result = -1;
  43.     glGetShaderiv(fragShaderPass0, GL_COMPILE_STATUS, &result);
  44.     if(GL_FALSE == result) {
  45.         GLchar errorMessage[1024];
  46.         glGetShaderInfoLog(fragShaderPass0, 1024, NULL, errorMessage);
  47.         std::cout << "Can't compile fragment shader:" << errorMessage << std::endl;
  48.         exit(-1);
  49.     }
  50.  
  51.     // Shader programm
  52.     shaderProgramHandlePass0 = glCreateProgram();
  53.     glAttachShader(shaderProgramHandlePass0, vertShaderPass0);
  54.     glAttachShader(shaderProgramHandlePass0, fragShaderPass0);
  55.     glLinkProgramARB(shaderProgramHandlePass0);
  56.  
  57.     //FBO
  58.     glGenFramebuffersEXT(1, &fboPass0);
  59.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
  60.  
  61.     glGenRenderbuffersEXT(1, &fboDepthBufferPass0);
  62.     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
  63.     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 1024, 1024);
  64.     glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
  65.  
  66.     glGenTextures(1, &renderResultPass0);
  67.     glBindTexture(GL_TEXTURE_2D, renderResultPass0);
  68.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,  1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  69.     glGenerateMipmapEXT(GL_TEXTURE_2D);
  70.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  71.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  72.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  73.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  74.     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderResultPass0, 0);  
  75.  
  76.     status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  77.     if(GL_FRAMEBUFFER_COMPLETE_EXT != status) {
  78.       std::cout << "FBO Pass0 Error!" << std::endl;
  79.       exit(-1);
  80.     }
  81.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  82. }
  83.  
  84. void ShaderBlurMeanFilter::renderToScreen(void) {
  85.     int uniformLocation0 = -1;
  86.     int uniformLocation1 = -1;
  87.  
  88.     // Set uniform variablen
  89.     uniformLocation0 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex1");
  90.     if(-1 == uniformLocation0) {
  91.         std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  92.     }
  93.     glActiveTexture(GL_TEXTURE0);
  94.     glBindTexture(GL_TEXTURE_2D, tmpTex1);
  95.     glUniform1iARB(uniformLocation0, 0);
  96.  
  97.     uniformLocation1 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex2");
  98.     if(-1 == uniformLocation1) {
  99.         std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  100.     }
  101.     glActiveTexture(GL_TEXTURE1);
  102.     glBindTexture(GL_TEXTURE_2D, tmpTex2);
  103.     glUniform1iARB(uniformLocation1, 1);
  104.  
  105.     // Use shader
  106.     glUseProgram(shaderProgramHandlePass0);
  107.  
  108.     // Render to fboPass0
  109.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
  110.         glPushAttrib(GL_VIEWPORT_BIT);
  111.         glViewport(0, 0, 1024, 1024);
  112.  
  113.         glBegin(GL_QUADS);
  114.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  115.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  116.             glVertex2f(-1.7f, -1.7f);
  117.            
  118.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  119.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
  120.             glVertex2f(-1.7f, 1.7f);
  121.  
  122.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  123.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  124.             glVertex2f(1.7f, 1.7f);
  125.  
  126.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  127.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  128.             glVertex2f(1.7f, -1.7f);
  129.         glEnd();
  130.  
  131.         glPopAttrib();
  132.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  133.  
  134.     // Render to screen
  135.     glUseProgram(NULL);
  136.  
  137.     glActiveTexture(GL_TEXTURE0);
  138.     glBindTexture(GL_TEXTURE_2D, renderResultPass0);
  139.         glEnable(GL_TEXTURE_2D);
  140.             glBegin(GL_QUADS);
  141.                 glTexCoord2f(0.0, 0.0);
  142.                 glVertex2f(-1.7f, -1.7f);
  143.  
  144.                 glTexCoord2f(0.0, 1.0);
  145.                 glVertex2f(-1.7f, 1.7f);
  146.  
  147.                 glTexCoord2f(1.0, 1.0);
  148.                 glVertex2f(1.7f, 1.7f);
  149.  
  150.                 glTexCoord2f(1.0, 0.0);
  151.                 glVertex2f(1.7f, -1.7f);
  152.             glEnd();
  153.         glDisable(GL_TEXTURE_2D);
  154.     glBindTexture(GL_TEXTURE_2D, 0);
  155. }
  156.  


Nun sehe ich immer die erste Texture egal welche ich in Shader setzt.

By the way, wenn ich im Shader gl_FragColor verwende dann landet doch mein render Ergebniss vom FBO in der Textureunit 0, dass heist ich muss
Code:
  1.  
  2. glActiveTexture(GL_TEXTURE0);
  3. glBindTexture(GL_TEXTURE_2D, renderResultPass0);
  4.  


machen bevor ich sie auf den Wuerfel aufbringe, oder?

Gruesse,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 18:28 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
egal


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 18:50 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Du hast schon recht, normalerweisse will ich "gl_FragColor = color;".

Aber um herauszufinden was los ist weisse ich tmp1 und tmp2 abwechselnd zu um zu sehen welche Textur ankommt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 22:52 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
egal


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 23:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Mit einem Debugger kann man solche Probleme i.d.R. ganz schnell finden, besonders wenn diese etwas komplexer sind und es mehrere Zusammenhänge gibt. Für OpenGL gibts dazu u.a. den gDEBugger, denn man 30 Tage kostenlos testen kann, der aber eine sehr komfortable Oberfläche hat. Hier gilt halt das Selbe wie beim "normalen" Programmieren : Der Debugger ist ein mächtiges Werkzeug.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 00:55 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
weiss doch jeder


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:20, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 01:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Gar nicht, Werte werden bei der Übergabe an gl_FragCoord (und an den meisten anderen Stellen auch) auf den Intervall [0..1] geclampt, daran kannst du nix ändern. Wenn man einen anderen Wertebereich möchte, muss man umrechnen, aber 32-Bit Genauigkeit sollten reichen.

P.S. : Das Werte im Shader geclampt werden ist Grundwissen, bevor man sich an Shader heranwagt sollte man sich dieses aneigenen, da man sonst oft auf Probleme trifft. Im Wiki haben wird dazu zwei Tutorials.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 01:25 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
egal


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:20, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 09:24 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Guten Morgen,

ich habe mich gestern mit dem "glslDevil" http://www.vis.uni-stuttgart.de/glsldevil/ angefreundet. Hat mir sehr bei meinem Problem geholfen, und mitlerweille geht es :)

Danke noch mal an alle!

Gruesse,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 21, 2007 09:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Um da auch noch meinen Senf dazu zu geben. Ich kann da Sascha nur zustimmen. Man sollte schon vorher sich Grundlagen aneignen auf der anderen Seite muss man es aber auch irgendwo lernen. Und dazu gehört unter anderem auch, dass man mal "auf die Nase fällt". Wozu man das jetzt zählen möchte ist jedem selbst überlassen allerdings sehe ich persönlich das auch eher bei den Grundlagen. Aber sei es drum.

Und um das Format GL_RGBA32_ARB. Du meinst sicher GL_RGBA32F_ARB. Allerdings du weißt schon was das bedeutet? Normalerweise benutzen Texturen 8 Bit Pro Kanal. Und 32F ist das 4 Fache. Hört sich auch noch nicht so viel an. Aber aus dem Beispiel von Oben bei einer 1024x1024 großen Textur machen das mal eben schlappe 16 MB Texturspeicher für eine einzige Textur. Wenn ich mich nicht vertue wird selbst für Deferred Shading (wie es in modernen Spielen vorkommt) nur mit RGBA8 Buffern gearbeitet. Dann aber gleich 3 Stück plus einen 24Bit F Tiefenbuffer. Insgesammt also noch 8 Bit Pro Kanal weniger.

Wenn du nicht gerade vor hast eine wissentschaftliche Anwendung zu programmieren solltest du so etwas bitte nur als Testanwendung sehen. Denn für einen effektiven Einsatz ist es einfach ein bisschen arg viel. Und du wirst niemandem glücklich machen, wenn du sagst, das mindestens 512 MB Grafikkartenspeicher benötigt wird. ;)

Das aber nur als Anmerkung um evtl das Verhältniss zwischen Aufwand und Nutzen besser einschätzen zu können.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 13 Queries | GZIP : On ]