Tag: 纹理

ffmpegvideo到opengl纹理

我试图渲染帧抓取和转换使用ffmpegvideo到OpenGL纹理放在一个四。 我已经非常疲惫的谷歌,没有find答案,以及我find答案,但他们似乎没有工作。 基本上,我使用avcodec_decode_video2()解码帧,然后sws_scale()将帧转换为RGB,然后glTexSubImage2D()创build一个openGL纹理,但似乎无法得到任何工作。 我已经确定“目标”AVFrame在SWS上下文设置中具有2维的权力。 这是我的代码: SwsContext *img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, 512, 256, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); //While still frames to read while(av_read_frame(pFormatCtx, &packet)>=0) { glClear(GL_COLOR_BUFFER_BIT); //If the packet is from the video stream if(packet.stream_index == videoStream) { //Decode the video avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet); //If we got a frame then convert it and […]

糟糕的OpenCL ImageSampling性能与OpenGL纹理采样

我最近将我的volumeraycaster从OpenGL移植到了OpenCL,这使得raycaster的性能降低了大约90%。 我跟踪了OpenCL的图像采样函数的性能下降,这些函数比相应的OpenGL纹理采样函数慢得多。 通过去除图像采样函数和纹理采样函数,两个raycaster实现具有相同的速度。 为了轻松实现不同硬件上的function,并排除其他RT代码中的一些愚蠢的错误,我写了一个小的基准,比较OpenCL采样速度和OpenGL采样速度,并在不同的机器上testing它, OpenCL仍然只有OpenGL性能的10%。 基准的OpenCL HostCode(至less是其中最重要的部分): void OGLWidget::OCLImageSampleTest() { try { int size=8; float Values[4*size*size*size]; cl::Kernel kernel=cl::Kernel(program,"ImageSampleTest",NULL); cl::ImageFormat FormatA(CL_RGBA,CL_FLOAT); cl::Image3D CLImage(CLcontext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR ,FormatA,size,size,size,0,0,Values,NULL); cl::ImageFormat FormatB(CL_RGBA,CL_UNSIGNED_INT8); cl::Image2D TempImage(CLcontext, CL_MEM_WRITE_ONLY,FormatB,1024,1024,0,NULL,NULL ); kernel.setArg(0, CLImage); kernel.setArg(1, TempImage); cl::Sampler Samp; Samp() = clCreateSampler( CLcontext(), CL_TRUE, CL_ADDRESS_REPEAT, CL_FILTER_LINEAR, NULL); kernel.setArg(2, Samp); QTime BenchmarkTimer=QTime(); BenchmarkTimer.start(); cl::KernelFunctor func = kernel.bind(queue, […]

glActiveTexture和glBindTexture之间的差异和关系

从我所收集的, glActiveTexture设置活动的“纹理单元”。 每个纹理单元可以有多个纹理目标(通常是GL_TEXTURE_1D,2D,3D或CUBE_MAP)。 如果我理解正确,您必须先调用glActiveTexture来设置纹理单元(初始化为GL_TEXTURE0 ),然后将(纹理目标)绑定到(一个或多个)纹理单元? 可用纹理单元的数量取决于系统。 我在库中看到多达32个枚举。 我想这基本上意味着我可以拥有我的GPU的极限(我认为是这样) 16 8)和32个纹理在GPU内存中的任何一个时间? 我想有一个额外的限制,我不超过我的GPU的最大内存(据说1 GB)。 我是否正确理解纹理目标和纹理单元之间的关系? 假设我有16个单位和4个目标,这是否意味着有16 * 4 = 64个目标的空间,还是不能这样工作? 接下来你通常要加载一个纹理。 你可以通过glTexImage2D来做到这一点。 其中的第一个参数是纹理目标。 如果像glBufferData这样工作 ,那么我们将“handle”/“texture name”绑定到纹理目标,然后将纹理数据加载到该目标中,从而间接将其与该句柄关联。 那么glTexParameter呢? 我们必须绑定纹理目标,然后再select同一个目标作为第一个参数? 或者只要我们拥有正确的活动纹理单元,纹理目标就不需要绑定了。 glGenerateMipmap也在目标上运行…目标必须仍然绑定到纹理名称才能成功? 那么当我们想要绘制具有纹理的对象时,我们是否必须同时select一个活动的纹理单元,然后select一个纹理目标? 或者我们select一个纹理单元,然后我们可以从与这个单元相关的4个目标中的任何一个中获取数据? 这是真的让我困惑的部分。

Three.js中同一网格物体上的多个透明纹理

是否可以在Three.js的同一个面上放置多个纹理,以便在GPU中加速GPU? 纹理是(或应该)应用到同一个面,以便底部纹理(纹理1)没有alpha通道,上面的纹理是像下面的图像示例中纹理2的方式alpha通道。 这种混合可以使用HTML5 Canvas作为预备步骤来实现,但是由于纹理位图可能很大,我倾向于跳过Canvas混合操作。 我testing了创build一个网格的副本,并应用每个网格一个纹理,并使其他网格透明,并移动了一点,这几乎成功,但有一些闪烁,因为对象不能完全在相同的位置,有一些纹理之间的空间不是正确的效果。 他们应该看起来像他们混合在例如。 Photoshop(如下图)。

Android的OpenGL纹理压缩

我需要一些帮助来查找如何使用Android纹理压缩的信息(或示例)。 我现在有很多PNG,我需要减less他们占用的内存量。 我正在寻找PVR压缩,但我不知道如何在OpenGL中使用它。 有些人可能会指向正确的方向或提供一些例子,因为我找不到任何东西。

OpenGL 2纹理内部格式GL_RGB8I,GL_RGB32UI等

我正在重写我的纹理代码的很大一部分。 我想能够指定特定的内部格式:GL_RGB8I,GL_RGB8UI,GL_RGB16I,GL_RGB16UI,GL_RGB32I和GL_RGB32UI。 这些令牌在OpenGL 2中不存在。 当将这些内部格式指定为glTexImage2D的参数时,纹理化失败(纹理显示为白色)。 当检查错误时,我得到[编辑:] 1282(“无效操作”)。 我认为这意味着OpenGL仍在为glTexImage2D使用OpenGL 2,所以调用失败。 显然,它将需要使用更新的版本才能成功。 像GL_RGB,GL_RGBA和(奇怪)GL_RGB32F,GL_RGBA32F枚举像预期的那样工作。 我configuration使用GLEW或GLee进行扩展。 我可以在其他地方使用OpenGL 4调用(例如,glPatchParameteri,glBindFramebuffer等),并且当然存在枚举。 为了完整性,glGetString(GL_VERSION)返回“4.2.0”。 我的问题:我可以强制其中一个扩展库使用OpenGL 4.2版本? 如果是这样,怎么样? 编辑:代码太复杂,但是这里是一个简单的,独立的使用GLee的例子,也演示了这个问题: #include <GLee5_4/GLee.h> #include <GL/gl.h> #include <GL/glu.h> #include <gl/glut.h> //For Windows #pragma comment(lib,"GLee.lib") #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glu32.lib") #pragma comment(lib,"glut32.lib") #include <stdlib.h> #include <stdio.h> const int screen_size[2] = {512,512}; #define TEXTURE_SIZE 64 //Choose a selection. If you see […]