如何通过opengl函数调用来改变lod偏差?我不喜欢默认设置,过早更改miplevels并使附近的地面看起来很难看.
我无法找到任何代码来执行此操作,每个主题都是关于一些执行此任务的外部程序...
编辑:这是我的纹理设置:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
Run Code Online (Sandbox Code Playgroud) 我正在看一本书中的一些示例代码,它通过重复将场景(在不同的偏移处)渲染到屏幕外纹理来创建抖动的抗锯齿效果,然后使用该纹理在主视图中重复绘制四边形,并设置一些混合内容.
为了"正确"累积颜色,代码设置颜色如下:
glColor4f(f, f, f, 1);
Run Code Online (Sandbox Code Playgroud)
其中f是1.0/number_of_samples,然后绑定屏幕外纹理并渲染它.
由于纹理带有自己的颜色和alpha数据,因此提前设置整体"颜色"的效果(数学和直观)是什么?
谢谢.
我有一个应用程序,将大大受益于数组纹理的使用.但是,我还无法确定当前WebGL规范和/或WebGL所基于的OpenGL ES 2.0中是否有数组纹理可用.
谁能解释一下这个问题呢?
有没有办法在OpenGl 4.3中将纹理应用于点精灵?我在互联网上搜索过,但大多数教程和指南都使用了仍然支持的旧版本:
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_FALSE);
Run Code Online (Sandbox Code Playgroud)
但是,似乎不再支持此功能,并且标准纹理环境似乎不起作用.关于如何做到或在何处找到如何做的任何建议?
我正在解析一个包含纹理坐标(vt)值的 obj 文件。据我了解,vt 值是与该 obj 对应的纹理图像的映射。
假设我的图像 im = 400x300 像素
我有一个 vt 值
VT .33345 .8998
映射表示,在图像中,转到坐标:
imageWidth x .3345 、 imageHeight x .8998 并使用那里的值。
我已将图像值加载到二维数组中。
问题是,这些映射坐标是浮点值,我该如何将它们映射到像素坐标的整数值?我总是可以截断小数部分、四舍五入等。但是标准是否定义了要执行哪一个选项?
我正在尝试将浮点值(高度图)数组作为GL_TEXTURE_2D发送到GLSL。当我设置好采样器后,问题出在使用glTexImage2D()上传纹理时发生的钳位。
glGenTextures(1, &_idnewTID);
glBindTexture(GL_TEXTURE_2D, _idnewTID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, regMesh._cols, regMesh._rows, 0, GL_RED, GL_FLOAT, regMesh._heightMap);
Run Code Online (Sandbox Code Playgroud)
我要发送的值在900.0f至1590.0f范围内。但这在加载到时会被完全钳制到1.0f GL_TEXTURE_2D。
如何保持值不被钳制到[0,1]。如何修改glTexImage2D()函数以实现此目标?
PS我知道采样器工作正常,因为当我将值除以1500.0f并将其上载到GPU并在着色器中缩放时,我得到了正确的高度图结构。
我正在使用openGL ES编写一个Android应用程序.我遵循了一些在线教程并设法使用硬编码顶点/索引/纹理坐标加载纹理立方体
作为下一步,我为wavefront .obj文件编写了一个解析器.我使用教程中的顶点等制作了一个模拟文件,加载很好.
但是,当我使用使用3d建模包制作的文件时,所有纹理都会混乱
下面是我目前获取纹理坐标的方式:
首先,我将所有纹理坐标加载vt到一个大向量中
接下来我找到每个f三角形的前两个纹理坐标(所以f 1/2/3 2/5/2 3/4/1意味着我采用第2和第5纹理坐标.因为.obj从1开始计数而不是0,我从位置开始必须为-1,然后将位置乘以2作为x坐标位置,并对我的vt数组中的y坐标位置执行相同但+1
我采用刚刚找到的那些纹理坐标并将它们添加到另一个矢量中.
一旦我完成了所有顶点.我将矢量转换为FloatBuffer,将其传递给glTexCoordPointer我的draw方法
这是解析文件的代码:
private void openObjFile(String filename, Context context, GL10 gl){
Vector<String> lines = openFile(filename, context); // opens the file
Vector<String[]> tokens = new Vector<String[]>();
Vector<Float> vertices = new Vector<Float>();
Vector<Float> textureCoordinates = new Vector<Float>();
Vector<Float> vertexNormals = new Vector<Float>();
// tokenise
for(int i = 0;i<lines.size();i++){
String line = lines.get(i);
tokens.add(line.split(" "));
}
for(int j = 0;j<tokens.size();j++){
String[] linetokens = tokens.get(j); …Run Code Online (Sandbox Code Playgroud) 我想从包含alpha透明度的.tga文件中应用纹理.当纹理绑定到对象时,它会显示对象本身的纯色.我希望颜色消失,或至少透明.如果我将对象颜色更改为透明,那么纹理整体变得更加透明,这不是我想要的.
有没有办法关闭颜色,或者我怎样才能使glColor4f不影响纹理?
void Sector::DrawPlanets(double gameTime){
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable( GL_BLEND );
glColor4f(0.0f, 0.0f, 1.0f,0.1f);
for(std::vector<Planet *>::iterator it = Planets.begin(); it != Planets.end(); it++){
double x,y,angle;
(*it)->GetPosition(&x,&y,&angle,gameTime);
int radius = (*it)->GetRadius();
glPushMatrix();
glTranslatef(x,y,0);
GLUquadricObj * sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere, GLU_FILL);
gluQuadricTexture(sphere, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, get_textures()[static_cast<int>((*it)->GetPlanetZone())]);
gluSphere(sphere,radius,20,20);
glPopMatrix();
}
glDisable(GL_TEXTURE_2D);
}
Run Code Online (Sandbox Code Playgroud)
侧面信息 我已经看到,加载纹理的方式也可能是问题的罪魁祸首.我也会把它包括在内.这是我从课堂上得到的代码,这就是我使用.tga的原因,因为它已经可以使用了.这是我认为相关的,一些功能不包括在内.
const int num_textures = 5;
static GLuint texName[num_textures];
void InitializeTextures(){
bool repeat[num_textures];
bool border[num_textures];
gliGenericImage *image[num_textures];
int n=0;
repeat[n] = false; border[n] = false;
image[n++] = readImage("ice.tga");
repeat[n] = false; …Run Code Online (Sandbox Code Playgroud) 我想知道如何在对象的表面上循环纹理.
对于一个实际的例子,我正在尝试处理渲染世界几何,所以当我调整一个两倍于其纹理大小的世界对象时,纹理将出现两次 - 不是两倍大小.
有没有正确的方法来处理这个?我能想到的唯一一件事就是物理地创建一个全新的纹理,它具有合适的大小并手动复制X次,但听起来它会很快耗尽大量内存.
这是在XAxis上调整平面大小时显示我正在寻找的图片:

与许多其他变量一起,我将对象的UVMap作为"纹理坐标"传递给我的着色器,然后执行以下操作以在绘制数组调用之前渲染对象的纹理:
QImage image;
image = worldObject->getQImage(i); //Within a for loop, grabs the right texture if the object has differing textures per face of object
glBindTexture(GL_TEXTURE_2D, spot);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
Run Code Online (Sandbox Code Playgroud) glBindTexture(GL_TEXTURE_2D_ARRAY, texture_id);
glTexStorage3D(GL_TEXTURE_2D_ARRAY,
1, // No mipmaps
GL_RGBA8, // Internal format
width, height, // width,height
1 // Number of layers
);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY,
0, // Mipmap number
0, 0, 0, // xoffset, yoffset, zoffset
width, height, 1, // width, height, depth
GL_RGBA8, // format
GL_UNSIGNED_BYTE, // type
image); // pointer to data
Run Code Online (Sandbox Code Playgroud)
为了测试我只创建一个长度为1的数组.我目前正在使用OpenGL 4.3,但我想切换回OpenGL 3.3,这意味着我无法使用glTexStorage3D.
所以我试着转向 glTexImage3D
glBindTexture(GL_TEXTURE_2D_ARRAY, texture_id);
glTexImage3D(GL_TEXTURE_2D_ARRAY,
1, // level
GL_RGBA8, // Internal format
width, height, 1, // width,height,depth
0, // border?
GL_RGBA, // format
GL_UNSIGNED_BYTE, …Run Code Online (Sandbox Code Playgroud)