c++ - Using CUDA, SFML, and OpenGL: Texture Refuses to Appear on Quad -


using various tutorials/examples/documentations/forums online, have typed out code allow cuda manipulate opengl textures such can outputted screen. method of displaying use pbo , allocated texture image of uchar4 array. despite attempts @ fixing problem, texture not show on 2d surface. cannot seem pinpoint problem.

these things have checked/done far: have created pbo , registered cuda, called cudagraphicsresourcegetmappedpointer , unmapping equivalent before , after gpu function calls, made sure glenable called 2d_texture, gldisable called unnecessary values, unbinded textures/buffers when not in need. have reset sfml opengl states in case sfml cause. square textures have been employed. opengl verision , cuda version work function calls use.

there did not seem errors within program when checked cudaerrors , opengl errors.

i not sure if has when call:

gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_nearest); gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_nearest); 

my quad not seem display.

i have found inspiration website. thank much!

here code:

main.cpp

#include <gl/glew.h> #include <windows.h> #include <gl/gl.h> #include <sfml/window.hpp> #include <sfml/opengl.hpp> #include <sfml/system.hpp> #include <sfml/graphics/renderwindow.hpp> #include "generaltypedef.h" #include "opengltest.cuh"   int main() {     // create window     sf::renderwindow window(sf::videomode(1024, 1024), "opengl");     //window.setverticalsyncenabled(true);     sf::vector2u windowsize;      windowsize = sf::vector2u(window.getsize());      bool running = true;     glewinit();     window.resetglstates();     std::printf("opengl: %s:", glgetstring(gl_version));     // not using sfml's gl states.      opengltest* test = new opengltest(window.getsize());      sf::time time;      while (running)     {         // handle events         sf::event event;         while (window.pollevent(event))         {             if (event.type == sf::event::closed)             {                 // end program                 running = false;             }             else if (event.type == sf::event::resized)             {                 // adjust viewport when window resized                 glviewport(0, 0, event.size.width, event.size.height);                 windowsize = window.getsize();             }          }          // clear buffers         glclear(gl_color_buffer_bit | gl_depth_buffer_bit);         test->createframe(time.asmicroseconds());         test->drawframe();         window.display();     }      // release resources...     delete test;      return 0; } 

opengltest.cuh

#ifndef opengltest_cuh #define opengltest_cuh  #include <gl/glew.h> #include <windows.h> #include <gl/gl.h>  #include <cuda.h> #include <cuda_runtime.h> #include <cuda_gl_interop.h> #include <sfml/opengl.hpp> #include <sfml/graphics.hpp> #include <sfml/system.hpp>  #include "generaltypedef.h"  class opengltest {     public:         uchar4* image;         gluint gltexture;         gluint pbo;         cudagraphicsresource_t cudapbo;         uchar4* d_texturebufferdata;          sf::vector2u windowsize;          opengltest(sf::vector2u windowsize)         {             this->windowsize = sf::vector2u(windowsize);             this->setupopengl();         };          ~opengltest()         {             delete image;             image == nullptr;             cudafree(d_texturebufferdata);             d_texturebufferdata == nullptr;             gldeletetextures(1, &gltexture);         }          void drawframe();         void createframe(float time);     private:         void setupopengl(); }; #endif //opengltest_cuh 

opengltest.cu

#include "opengltest.cuh"  __global__ void creategputexture(uchar4* d_texture) {     uint pixelid = blockidx.x*blockdim.x + threadidx.x;     d_texture[pixelid].x = 0;     d_texture[pixelid].y = 1;     d_texture[pixelid].z =  1;     d_texture[pixelid].w = 0; } __global__ void wow(uchar4* pos, unsigned int width, unsigned int height,     float time) {     int index = blockidx.x * blockdim.x + threadidx.x;     unsigned int x = index%width;     unsigned int y = index / width;      if (index < width*height) {         unsigned char r = (x + (int)time) & 0xff;         unsigned char g = (y + (int)time) & 0xff;         unsigned char b = ((x + y) + (int)time) & 0xff;          // each thread writes 1 pixel location in texture (textel)         pos[index].w = 0;         pos[index].x = r;         pos[index].y = g;         pos[index].z = b;     } } void opengltest::drawframe() {     glcolor3f(1.0f,1.0f,1.0f);      glbindtexture(gl_texture_2d, gltexture);     glbindbuffer(gl_pixel_unpack_buffer_arb, pbo);     gltexsubimage2d(gl_texture_2d, 0, 0, 0, windowsize.x, windowsize.y, gl_rgba, gl_unsigned_byte, 0);      glbegin(gl_quads);     gltexcoord2f(0.0f, 0.0f);     glvertex2f(0.0f, float(windowsize.y));     gltexcoord2f(1.0f, 0.0f);     glvertex2f(float(windowsize.x), float(windowsize.y));     gltexcoord2f(1.0f, 1.0f);     glvertex2f(float(windowsize.x), 0.0f);     gltexcoord2f(0.0f,1.0f);     glvertex2f(0.0f, 0.0f);     glend();      glflush();      // release     glbindbuffer(gl_pixel_unpack_buffer_arb, 0);     glbindtexture(gl_texture_2d, 0);      // test triangle     /*     glbegin(gl_triangles);     glcolor3f(0.1, 0.2, 0.3);     glvertex2f(0, 0);     glvertex2f(10, 0);     glvertex2f(0, 100);     glend();     */ }  void opengltest::createframe(float time) {     cudagraphicsmapresources(1, &cudapbo, 0);     size_t numbytes;     cudagraphicsresourcegetmappedpointer((void**)&d_texturebufferdata, &numbytes, cudapbo);      int totalthreads = windowsize.x * windowsize.y;     int nblocks = totalthreads/ 256;      // run code here.     creategputexture << <nblocks,  256>> >(d_texturebufferdata);     //wow << <nblocks, 256 >> >(d_texturebufferdata, windowsize.x, windowsize.y, time);     // unmap mapping pbo opengl can access.     cudagraphicsunmapresources(1, &cudapbo, 0); }  void opengltest::setupopengl() {     image  = new uchar4[1024*1024];      glviewport(0, 0, windowsize.x, windowsize.y);      glmatrixmode(gl_modelview);     glloadidentity();      glmatrixmode(gl_projection);     glloadidentity();     glortho(0.0, windowsize.x, windowsize.y, 0.0, -1.0, 1.0);      glenable(gl_texture_2d);     gldisable(gl_lighting);     gldisable(gl_depth_test);      // unbind textures previous.     glbindtexture(gl_texture_2d, 0);     glbindbuffer(gl_pixel_unpack_buffer_arb, 0);      // create new textures.     glgentextures(1, &gltexture);     glbindtexture(gl_texture_2d, gltexture);      gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_clamp_to_edge);     gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_clamp_to_edge);     gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_nearest);     gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_nearest);      // create image same resolution window.     glteximage2d(gl_texture_2d, 0, gl_rgba, windowsize.x , windowsize.y, 0, gl_rgba, gl_unsigned_byte, image);       // create pixel buffer boject.     glgenbuffers(1, &pbo);     glbindbuffer(gl_pixel_unpack_buffer_arb, pbo);     glbufferdata(gl_pixel_unpack_buffer_arb, windowsize.x * windowsize.y * sizeof(uchar4), image, gl_stream_copy);      cudagraphicsglregisterbuffer(&cudapbo, pbo, cudagraphicsmapflagsnone);      glbindbuffer(gl_pixel_unpack_buffer_arb, 0);     glbindtexture(gl_texture_2d, 0); } 

generaltype

#ifndef generaltypedef_cuh #define generaltypedef_cuh typedef unsigned int uint;  #endif // generaltypedef_cuh 

after rewriting entire code , understanding more, have figured out reason. color components uchar4 in kernel function mapped 0-255. w component transparency. such, should mapped 255 image show. hope helps may have same problem. sites have value set low well.


Comments