从我收集的内容中,glActiveTexture
设置活动的"纹理单元".每个纹理单元可以具有多个纹理目标(通常为GL_TEXTURE_1D,2D,3D或CUBE_MAP).
如果我理解正确,你必须先调用glActiveTexture
纹理单元(初始化为GL_TEXTURE0
),然后将(一个或多个)"纹理目标"绑定到该纹理单元?
可用的纹理单元的数量取决于系统.我在我的图书馆看到最多32个枚举的枚举.我想这实际上意味着我可以拥有GPU的极限(我认为是这样)168)在任何时候GPU内存中都有32个纹理?我想还有一个额外的限制,我没有超过GPU的最大内存(据说是1 GB).
我能正确理解纹理目标和纹理单元之间的关系吗?假设我允许每个16个单位和4个目标,这是否意味着有16*4 = 64个目标的空间,或者它不能那样工作?
接下来,您通常要加载纹理.你可以通过这样做glTexImage2D
.第一个参数是纹理目标.如果这样工作glBufferData
,那么我们基本上将"句柄"/"纹理名称"绑定到纹理目标,然后将纹理数据加载到该目标中,从而间接地将其与该句柄相关联.
怎么样glTexParameter
?我们必须绑定一个纹理目标,然后再次选择同一个目标作为第一个参数?或者,只要我们有正确的活动纹理单元,纹理目标是否不需要绑定?
glGenerateMipmap
也在目标上运行......目标必须仍然绑定到纹理名称才能成功?
然后,当我们要引起我们的对象上有一个纹理,我们要不要都选择积极的纹理单元,然后一个纹理目标?或者我们选择一个纹理单元,然后我们可以从与该单元相关的4个目标中的任何一个中获取数据?这是让我很困惑的部分.
我需要一些帮助来查找如何使用Android纹理压缩的信息(或示例).我现在有很多PNG,我需要减少他们占用的内存量.我在看PVR压缩,但我无法弄清楚如何在OpenGL中使用它.
有些人可能指出我正确的方向或提供一些例子,因为我找不到任何东西.
我最近将我的volumeraycaster从OpenGL移植到OpenCL,这使得raycaster的性能降低了大约90%.我跟踪了OpenCL的图像采样功能的性能下降,这比相应的OpenGL纹理采样功能慢得多.通过删除图像采样功能和纹理采样功能,两个raycaster实现具有大致相同的速度.为了轻松地在不同的硬件上使用功能,并在其余的RT代码中排除一些愚蠢的错误,我写了一个小的基准测试,将OpenCL采样速度与OpenGL采样速度进行比较,并在不同的机器上进行测试但是OpenCL仍然只占OpenGL性能的10%左右.
基准测试的OpenCL HostCode(至少是其中最重要的部分):
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, cl::NDRange(1024,1024), cl::NDRange(32,32));
func().wait();
int Duration = BenchmarkTimer.elapsed();
printf("OCLImageSampleTest: %d ms \n", Duration);
}
catch (cl::Error& err)
{
std::cerr << "An OpenCL error occured, " << err.what()
<< "\nError num …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ffmpeg渲染帧并将其从视频转换为OpenGL纹理以放置在四边形上.我已经筋疲力尽了谷歌并没有找到答案,我找到了答案,但似乎没有一个有效.
基本上,我avcodec_decode_video2()
用来解码帧然后sws_scale()
将帧转换为RGB然后glTexSubImage2D()
从它创建一个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 put it into RGB buffer
if(frameFinished) {
printf("frame finished: %i\n", number);
sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
glBindTexture(GL_TEXTURE_2D, texture);
//gluBuild2DMipmaps(GL_TEXTURE_2D, …
Run Code Online (Sandbox Code Playgroud) 我想知道为什么在Simplex问世后,Perlin噪音仍然如此受欢迎.单一噪声是由Ken Perlin自己制作的,并且它假设接管他的旧算法,这种算法对于更高的尺寸和更好的质量(没有可见的伪像)来说是缓慢的.
单面噪声在2001年出现,在过去的10年里,我只看到人们谈论Perlin噪声,当涉及到为地形生成高度图,创建程序纹理等等.
任何人都可以帮助我,Simplex噪音有一些缺点吗?我听说有传言说Perlin噪音在1D和2D噪音方面更快,但我不知道它是否真实.
谢谢!
我的纹理比我的UIButton短得多.
我有这个纹理:
我应该创建这个按钮:
我应该如何伸展(而不是平铺)这种纹理?沿水平方向拉伸
日Thnx
我只是想创建一个非常简单的片段着色器,它为网格绘制指定的纹理.我查看了一些自定义片段着色器,它们完成了相同的操作并构建了自己的着色器并支持它周围的JS代码.但是,它只是不起作用.这是我正在尝试运行的代码的工作抽象:
顶点着色器
<script id="vertexShader" type="x-shader/x-vertex">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(position,1.0);
}
</script>
Run Code Online (Sandbox Code Playgroud)
片段着色器
<script id="fragmentShader" type="x-shader/x-fragment">
uniform sampler2D texture1;
varying vec2 vUv;
void main() {
gl_FragColor = texture2D(texture1, vUv); // Displays Nothing
//gl_FragColor = vec4(0.5, 0.2, 1.0, 1.0); // Works; Displays Flat Color
}
</script>
Run Code Online (Sandbox Code Playgroud)
场景代码
<script>
// Initialize WebGL Renderer
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
var canvas = document.getElementById('canvas').appendChild(renderer.domElement);
// Initialize Scenes
var scene = new …
Run Code Online (Sandbox Code Playgroud) 我用纸张纹理图案扫描了一张旧照片,我想尽可能地去除纹理而不降低图像质量.有没有办法,可能在MATLAB中使用图像处理工具箱?
我试图应用FFT转换(使用Photoshop插件),但我找不到任何明显的白点可以画画.对于这种方法,这种模式可能不那么规律吗?
您可以在下面看到示例.如果您需要完整的图像,我可以将其上传到某处.
总是使用1的alginment有什么缺点?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
Run Code Online (Sandbox Code Playgroud)
它会影响现代gpus的性能吗?
是否有可能在Three.js中的同一面上将多个纹理叠加在一起,以便在webGL中加速alpha加速?
纹理(或应该)应用于同一面,使得底部纹理(纹理1)没有alpha通道,并且上面的纹理以类似下面图像示例中的纹理2的方式被引导.
这种混合可以使用HTML5 Canvas作为前置步骤来实现,但由于纹理位图可能很大,我更喜欢跳过Canvas混合操作.
我通过创建网格的副本并对每个网格应用一个纹理进行测试,并使其他网格透明并移动了一点,几乎成功,但有一些闪烁,因为对象不能完全在同一位置,有一些纹理之间的空间不是正确的效果.他们看起来应该像是混合在一起.Photoshop(如下图所示).