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
Post a Comment