我正在尝试在 WebGL2 中使用浮点纹理。我像这样初始化纹理:
function textureFromFloat32Array( gl, arr, w, h ){
//https://developer.mozilla.org/en-US/docs/Web/API/OES_texture_float_linear
gl.getExtension('OES_texture_float'); // just in case
gl.getExtension('OES_texture_float_linear'); // do I need this with WebGL2
const texture = gl.createTexture();
gl.bindTexture( gl.TEXTURE_2D, texture);
// see https://www.khronos.org/registry/webgl/specs/latest/2.0/#TEXTURE_TYPES_FORMATS_FROM_DOM_ELEMENTS_TABLE
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32F, w, h, 0, gl.RED, gl.FLOAT, arr);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
//gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); // this works
//gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
return texture;
}
Run Code Online (Sandbox Code Playgroud)
在 Firefox 55.0.2(64 位)中,出现以下错误:
Error: WebGL warning: drawElements: Active texture 0 for target …
我想照亮纹理平面,但这行不通。实心球上的光很好,但纹理平面上的光不亮。
实心球体上的照明效果良好。
但是,纹理平面上的照明不起作用。(GL_DECAL,GL_REPLACE;我也尝试过GL_MODULATE)
这是我的渲染代码的片段。(完整代码在 GitHub 上)
加载纹理。
sf::Image image;
if (!image.loadFromFile(path))
return false;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
image.getSize().x, image.getSize().y, 0,
GL_RGBA, GL_UNSIGNED_BYTE,
image.getPixelsPtr()
);
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_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Run Code Online (Sandbox Code Playgroud)
初始化
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glShadeModel(GL_SMOOTH);
//glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glutSetCursor(GLUT_CURSOR_NONE);
light.Init();
camera.SetPin((GLfloat)width / 2, (GLfloat)height/2);
Run Code Online (Sandbox Code Playgroud)
显示回调
adjustPerspective();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_LIGHTING);
glPushMatrix();
camera.SetLookAt();
light.On();
// TODO: dsiplay processing
for (auto& obj …
Run Code Online (Sandbox Code Playgroud) 当我注意到纹理引用已被弃用时,我正在使用纹理引用,我尝试更新我的测试函数以使用 tex1Dfetch 处理“新”无绑定纹理对象,但无法产生相同的结果。
\n\n我目前正在探索使用纹理内存来加速我的 aho-corasick 实现;我能够得到tex1D()
使用纹理引用,但是,我注意到它们已被弃用,并决定使用纹理对象。
当我尝试以任何方式使用结果时,我会遇到一些非常奇怪的内核行为;我可以results[tidx] = tidx;
没有任何问题,但只返回notresults[tidx] = temp + 1;
的值或涉及 的任何其他数值测试。temp
temp * 3
temp
我看不出这种行为的逻辑原因,并且文档示例看起来非常相似,我看不出哪里出了问题。
\n\n我已经读过 CUDA tex1Dfetch() 错误行为和 New CUDA 纹理对象 \xe2\x80\x94 在 2D 情况下获取错误数据,但这似乎都与我遇到的问题无关。
\n\n以防万一它有所作为;我正在使用 CUDA 版本 10.0、V10.0.130 和 Nvidia GTX 980ti。
\n\n#include <iostream>\n\n__global__ void test(cudaTextureObject_t tex ,int* results){\n int tidx = threadIdx.y * blockDim.x + threadIdx.x;\n unsigned temp = tex1Dfetch<unsigned>(tex, threadIdx.x);\n results[tidx] = temp * 3;\n}\n\nint main(){\n int *host_arr;\n const …
Run Code Online (Sandbox Code Playgroud) 在我的(C++/OpenGL)程序中,我加载一组纹理并设置纹理参数,如下所示:
\n\n//TEXTURES\nglGenTextures(1, &texture1);\nglBindTexture(GL_TEXTURE_2D, texture1);\n// set the texture wrapping parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n// set texture filtering parameters\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n
Run Code Online (Sandbox Code Playgroud)\n\n我发现各向异性过滤可以帮助我增强场景的外观。因此,我使用这一行来实现它:
\n\nglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n虽然我在我的笔记本电脑(有 AMD GPU 供应商)上编译这行代码没有任何问题,但我无法在使用 Intel(R) HD Graphics 530 (Skylake GT2) 的另一台计算机上编译这段代码。\n具体来说,尝试使用 g++ 编译该代码段会输出以下错误:
\n\nerror: \xe2\x80\x98GL_TEXTURE_MAX_ANISOTROPY\xe2\x80\x99 was not declared in this scope\n glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);\n
Run Code Online (Sandbox Code Playgroud)\n\n更具体地说,在我的 Linux 终端中运行以下命令:
\n\nglxinfo | grep -i opengl\n
Run Code Online (Sandbox Code Playgroud)\n\n显示有关我的 GPU 供应商和 OpenGL 支持的以下详细信息:
\n\n\n\n我知道在 中启用了各向异性过滤ARB_texture_filter_anisotropic
,但老实说,我不知道如何检查我的 GPU 供应商是否支持该扩展,如果支持,我如何才能使用各向异性过滤? …
我正在尝试了解纹理钳制在OpenGL或任何其他API中如何工作。我知道一个事实,您将操作定义为将范围从[0,1]扩展到任何值,但将其限制在边缘。
所以,如果我有一个伪代码功能:
unsigned int clampedTexel(float u, float v)
{
if(u < 0) u = 0;
if(u >= width) u = width-1;
if(v < 0) v = 0;
if(v >= height) v = height-1;
return image[u][v];
}
(来源:www.cs.unc.edu上的sud)
对?所以,如果我超出范围,如u方向上的1.1,为什么不将其固定在末尾的黑色上?在此示例中,它不是黑色,而是白色。我误会了吗?为什么黑色旁边的值固定为白色?
或与边缘颜色交替的任何其他扩展名。请帮助我看看我要去哪里。
这个问题困扰着我.我正在测试一些Haskell绑定到OpenGL,我创建了一个顶点着色器,一个片段着色器,编译程序,并在转换顶点后在屏幕上绘制一个纹理矩形......除了屏幕是空白的.
当我渲染矩形平白而不是在片段着色器中使用采样器时,它工作正常.当我进入gdebugger并使用选项将所有纹理替换为存根纹理时,它也可以正常工作.
当我在gdebugger中查看分配的纹理时,没有纹理对象,只有默认的2d纹理.当我在glTexImage2d上设置断点时,我看到它被调用了,但是当我用gdebugger查看它时,内存中没有纹理对象出现.
这是怎么回事?我忘了设置一些环境变量吗?我很沮丧.踢球者之前我遇到过这个问题,然后我设法解决了这个问题,但我忘记了问题所在.我讨厌自己> _>
OpenGL使用2次幂纹理.这是因为由于MipMapping,一些GPU仅接受2次幂纹理.在绘制比它大的纹理时,使用这些2次幂纹理会导致问题.
我曾经想过一种方法来解决这个问题,那就是当我们使纹理比实际更小时使用PO2比率,并且当我们使它变大时使用1:1的比例,但这会创建某些GPU的兼容性问题?
如果有人知道是否会出现问题(我无法检查这一点,因为我的GPU接受NPO2纹理),或者更好的解决方法,我将不胜感激.
我试图制作简单的纹理,但是出现了一个错误:
错误:'my_texture'没有命名类型
这里出现的地方(LoadTexture
方法后面):
GLuint my_texture;
my_texture = LoadTexture( "grass.bmp" );
Run Code Online (Sandbox Code Playgroud)
这是我的代码.怎么了?
#include <iostream>
#include <GL/gl.h>
#include <GL/glut.h>
#include <stdio.h> /* printf, scanf, NULL */
#include <stdlib.h> /* malloc, free, rand */
using namespace std;
float _angle = 0.5f;
GLuint LoadTexture( const char * filename )
{
GLuint texture;
int width, height;
unsigned char * data;
FILE * file;
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
width = 1024;
height = 512; …
Run Code Online (Sandbox Code Playgroud) 哪个命令将ram像素缓冲区准确上传到视频内存中的纹理?
这是glTexImage2D(...)?也许或其他什么?
如果我有一些纹理,并想要更改RAM缓冲区内容我可以用什么命令将其转移到视频卡?
我可以用于此目的?
因此,我一直在使用learnopengl.com书,并且一直无法让纹理单元工作.起初我在主循环中调用glGetUniform1i,就像他在书中所做的那样,但是建议(通过#learnprogramming IRC)将任何纹理操作限制在主循环之前.使用本书的代码时,问题是纹理不会像片段着色器中那样正确混合,只会渲染绑定到GL_TEXTURE_2D的第二个纹理(在本例中为"faceTexture").翻转渲染顺序可以渲染出先前使用的纹理.
但是,在主循环之前放置纹理单元代码会导致glUniform1i调用上的无效操作:
File "C:/Users/1117254/Documents/Python Experiments/OpenGL/OpenGL Testing/main.py", line 171, in main
glUniform1i(wood_texture_loc, 0)
File "C:\Users\1117254\AppData\Local\Programs\Python\Python36\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__
return self( *args, **named )
File "errorchecker.pyx", line 53, in
OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src\errorchecker.c:1218)
OpenGL.error.GLError: GLError(
err = 1282,
description = b'invalid operation',
baseOperation = glUniform1i,
cArguments = (23724032, 0)
)
Run Code Online (Sandbox Code Playgroud)
我的错误似乎与frag着色器中统一变量的位置有关,但我不确定glGetUniformLocation给出的位置(似乎是23724032)是否有效.
下面的相关源以及顶点和片段着色器:
# Shader
shader = shader_loader.Shader("vertex.vs", "fragment.fs")
# Vertex Buffering
vao = GLuint(0)
vbo = GLuint(0)
ebo = GLuint(0)
glGenVertexArrays(1, vao)
glGenBuffers(1, vbo)
glGenBuffers(1, ebo)
glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, …
Run Code Online (Sandbox Code Playgroud)