如何重复选择纹理图集?
例如,我的精灵(选择)在纹理坐标内:
GLfloat textureCoords[]=
{
.1f, .1f,
.3f, .1f,
.1f, .3f,
.3f, .3f
};
Run Code Online (Sandbox Code Playgroud)
然后我想重复该精灵N次到由以下定义的三角形条带(或四边形):
GLfloat vertices[]=
{
-100.f, -100.f,
100.f, -100.f,
-100.f, 100.f,
100.f, 100.f
};
Run Code Online (Sandbox Code Playgroud)
我知道它GL_REPEAT与textureCoords有关,并且通过了范围[0,1].然而,这不起作用:(试图重复N = 10)
GLfloat textureCoords[]=
{
10.1f, 10.1f,
10.3f, 10.1f,
10.1f, 10.3f,
10.3f, 10.3f
};
Run Code Online (Sandbox Code Playgroud)
我们看到我们的全纹理图集重复...
我怎么能以正确的方式做到这一点?
我很高兴能够使用c ++开始在OpenGL中编写一些东西.
任何人都可以在此列出应该安装哪些工具来启动此过程.
即
IDE编译器OpenGL下载等?
没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个mipmap.我这样做是为了进行单元测试.似乎没有一个glGetTexParameter参数可以找到它.我最接近的是这样的:
int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
int width;
glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
if ( 0 == width )
{
max_mipmap = i-1;
break;
}
)
Run Code Online (Sandbox Code Playgroud)
无论如何,glGetTexLevelParameter()如果我使用的是NVidia GPU,将为不存在的mipmap返回0宽度,但是对于Mesa,它会返回GL_INVALID_VALUE,这让我相信这是非常错误的事情.
如何找出我填充纹理的mipmap级别?
我不想使用#include宏来在glsl中包含着色器文件,我听说有一个ARB_shading_language_include 扩展支持#include宏.有没有人可以给我一个显示如何使用#include宏的代码片段?
在我的应用程序中,我广泛使用glTexImage2D.我复制一些图像的图像并将其渲染为纹理,我每次点击鼠标都会经常这样做.我把它作为一个字节数组进行渲染.内存正在被占用,交换内存也被分配.这是内存泄漏吗?或者是因为glTexImage2D包含任何引用或其他任何内容.
编辑:
//I allocate the memory once
GLuint texName;
texture_data = new GLubyte[width*height];
// Each time user click I repeat the following code (this code in in callback)
// Before this code the texture_data is modified to reflect the changes
glGenTextures(3, &texname);
glBindTexture(GL_TEXTURE_2D, texname);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,texture_data);
Run Code Online (Sandbox Code Playgroud)
我希望你的近距离请求和投票现在停止!
OpenGL文档glUseProgram声称,使用参数零调用它将导致着色器执行的结果undefined.
但是,经过一番搜索后,我看到了几个人glUseProgram用来卸载当前着色器程序的例子.
这种行为可靠吗?如果没有,那到底究竟做了glUseProgram(0)什么?
我不是母语是英语,当我试图通过openGL的维基和教程www.learnopengl.com得到的,它永远不会结束的直觉概念如何整部作品可以理解的.有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?
QT文档说,从qt5开始,你应该使用QOpenGL*类而不是QGL*.
问题是没有QGLWidget替换.我想出你应该将QWindow与QOpenGLContext结合使用并调用setSurfaceType(OpenGLSurface);.
唯一的问题是QWindow不能将QWidget作为父级.那我怎么能嵌入一个QWindow aka.我的OpenGL绘图表面进入其他小部件?
我试图通过片段着色器调整纹理颜色.我的片段着色器非常简单:
uniform sampler2D sampler;
void main() {
vec4 tex = texture2D ( sampler, uvVarying );
gl_FragColor = vec4(tex.r, tex.g, tex.b, tex.a);
}
Run Code Online (Sandbox Code Playgroud)
这按照预期绘制了我的狗纹理:

如果我然后将着色器更改为
gl_FragColor = vec4(tex.r, tex.g, tex.b, 1.0);
Run Code Online (Sandbox Code Playgroud)
结果是我的预期,透明度信息丢失:

但如果我把它设置为:
gl_FragColor = vec4(tex.r, tex.g, tex.b, 0.0);
Run Code Online (Sandbox Code Playgroud)
我期待它完全消失,但我得到:

到底是怎么回事??
对于我原来的问题:我想在我的纹理中添加一点红色:
gl_FragColor = vec4(tex.r + 0.5, tex.g, tex.b, tex.a);
Run Code Online (Sandbox Code Playgroud)
现在,我希望它与原始纹理具有相同的透明度信息,但我得到了这个:

我在这里想念的是什么 纹理使用引擎的默认混合src = GL_ONE, dst = GL_ONE_MINUS_SRC_ALPHA.
只是想知道我应该期待什么样的速度,我一直试图在全局内存和着色器之间进行基准测试,而不是依赖于GPU规格表.但是我无法接近理论上的最大值.事实上,我出局了50倍!
我正在使用GTX Titan X,据说它有336.5GB/s.Linux x64驱动程序352.21.
我在这里找到了一个CUDA基准测试,它给了我~240-250GB/s(这更符合我的预期).
我正在尝试将它们与着色器完全匹配.我已经试过顶点着色器,计算着色,经由访问缓冲器对象image_load_store和NV_shader_buffer_store,具有floatS,vec4S,着色器内循环(与工作组内聚结的寻址)和定时的各种方法.我卡在~7GB/s(参见下面的更新).
为什么GL这么慢?我做错了什么,如果是的话,应该怎么做?
这是我的MWE有三种方法(1.顶点着色器与image_load_store,2.顶点着色器与无绑定图形,3.计算着色器与无绑定图形):
//#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <memory.h>
#include <GL/glew.h>
#include <GL/glut.h>
const char* imageSource =
"#version 440\n"
"uniform layout(r32f) imageBuffer data;\n"
"uniform float val;\n"
"void main() {\n"
" imageStore(data, gl_VertexID, vec4(val, 0.0, 0.0, 0.0));\n"
" gl_Position = vec4(0.0);\n"
"}\n";
const char* bindlessSource =
"#version 440\n"
"#extension GL_NV_gpu_shader5 : enable\n"
"#extension GL_NV_shader_buffer_load : …Run Code Online (Sandbox Code Playgroud)