标签: texture-mapping

如何在 Three.js 中重复纹理而不拉伸?

无论我做什么,我的纹理似乎都会被拉伸/缩放到我应用它们的网格的大小。我已经阅读了这个问题的很多答案,似乎没有一个解决方案可以为我解决问题,所以我发布了一个新的解决方案。只是一点信息,

  • 我的纹理都是 64x64 像素
  • 我正在预加载所有纹理
  • 我正在使用 Web GL 渲染器

这是我的代码

makeTestObject:function()
{
    var scope = this,
        tileGeometry = new THREE.BoxGeometry(TILE_SIZE , TILE_HEIGHT , TILE_SIZE),
        texture = new THREE.Texture(preloadedImageObject),
        textureMaterial = new THREE.MeshLambertMaterial({map:texture}),
        tile = new THREE.Mesh(tileGeometry , new THREE.MeshFaceMaterial(
        [
            textureMaterial, // +x
            textureMaterial, // -x
            textureMaterial, // +y
            textureMaterial, // -y
            textureMaterial, // +z
            textureMaterial // -z
        ]));

    texture.wrapS = THREE.RepeatWrapping;
    texture.wrapT = THREE.RepeatWrapping;

    tile.position.y = BASE_HEIGHT * 2;
    tile.castShadow = true;
    tile.receiveShadow = true;
    texture.needsUpdate = true;
    scope.scene.add(tile); …
Run Code Online (Sandbox Code Playgroud)

javascript textures texture-mapping three.js

4
推荐指数
1
解决办法
6126
查看次数

如何制作python ursina引擎的立方体纹理

我想知道如何在 Python Panda3D 包装器、ursina引擎库中制作简单的立方体纹理。这是我尝试过的代码。

from ursina import *

app = Ursina()
window.fps_counter.enabled = False


class Voxel(Button):
    def __init__(self, position=(0,0,0), texture='red.png'):
        super().__init__(
            parent = scene,
            position=position,
            model='cube',
            origin_y=0.5,
            texture=texture,
            color=color.color(0,0, random.uniform(0.9, 1.0)),
            scale = 1.0
        )


for x in range(3):
    for y in range(3):
        for z in range(3):
            voxel = Voxel(position=(x,y,z))
EditorCamera()
app.run()
Run Code Online (Sandbox Code Playgroud)
  1. 我想知道如何制作 uv 贴图(我制作的一张非常糟糕)。
  2. 我想知道将 uv 贴图转换为ursina引擎立方体纹理。

python 3d texture-mapping game-engine panda3d

4
推荐指数
1
解决办法
5279
查看次数

4
推荐指数
1
解决办法
219
查看次数

使用网格数据和1D纹理贴图在opengl中创建等高线图

我在一个规则间隔的网格上有一组X,Y,Z值,我需要使用C++创建一个颜色填充的等高线图.我已经在谷歌上搜索了好几天,而且似乎是在openGL中使用1D纹理贴图可以实现这一点.但是我还没有找到一个如何实际执行此操作的示例,并且我没有在任何地方阅读openGL文档.我的困惑归结为一个核心问题:

我的数据不包含每个像素的X,Y值 - 它是一个规则间隔的网格,在X和Y轴上每4个单位有一个数据,具有正整数Z值.

例如:(0,0,1),(4,0,1),(8,0,2),(0,4,2),(0,8,4),(4,4,3)等

由于轮廓将基于Z值并且数据点之间存在间隙,因此应用一维纹理如何实现轮廓此数据(即如何在网格点之间应用一维纹理内插?)

我最接近找到这个例子的是红茶书的在线版本(http://fly.cc.fer.hr/~unreal/theredbook/chapter09.html),但是我是茶壶假设茶壶模型具有每个像素的数据,因此不需要数据点之间的插值.

如果有人能够阐明我的问题或更好地指出以这种方式使用一维纹理贴图的具体例子,我会永远感激,因为我已经在这个项目上烧了两天而没什么可展示的.

编辑:

下面的代码是我正在使用的,虽然它确实显示了正确位置的点,但没有插值或轮廓发生 - 这些点只显示为点.

//Create a 1D image - for this example it's just a red line
int stripeImageWidth = 32;
GLubyte   stripeImage[3*stripeImageWidth];
for (int j = 0; j < stripeImageWidth; j++) {
    stripeImage[3*j] = j < 2 ? 0 : 255;
    stripeImage[3*j+1] = 255;
    stripeImage[3*j+2] = 255;
}
glDisable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage1D(GL_TEXTURE_1D, 0, 3, stripeImageWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, stripeImage);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl texture-mapping

3
推荐指数
1
解决办法
4914
查看次数

四条纹纹理变形

我有一个GL_QUAD_STRIP,我是纹理映射.四边形条带自身折叠以形成UV球体.基本上,四边形条通常不是由矩形 - 而是梯形.

我遇到纹理失真问题.纹理坐标是正确的(例如,它们排列得很好).问题出在梯形面上.

我希望纹素朝着梯形面的较大一端对着较大的区域,但是面部看起来分成两个三角形.它看起来类似于仿射纹理映射(但我认为它不是;它看起来仍然是正确的,我不希望它仍然被使用).

我知道显卡通常会在内部将四边形减少为三角形,但我不希望这会影响纹理...

所以,我不知道这里发生了什么.有什么想法吗?

以下是不良行为的示例.低分辨率地球纹理,最近的过滤,没有mipmap或各向异性: 在此输入图像描述

opengl textures texture-mapping

3
推荐指数
1
解决办法
2872
查看次数

在进行子像素转换时,2D纹理会失真

我想知道一个理论推理为什么这甚至可能:几何的转换如何与纹理映射相关.

  • 我只能在进行子像素转换时注意到这种效果,如果由整个像素转换,纹理看起来很好.
  • 我使用正投影GL_CLAMP_TO_EDGE,GL_NEAREST,片段着色器是highp.
  • 纹理坐标是地图集的一个子区域,但即使整个地图集被映射,我也可以看到失真.
  • 使用OpenGL ES(Android和iOS),但在重新标记之前,任何人都可以解释这不是OpenGL中的问题.

我试过的事情:

opengl textures texture-mapping opengl-es-2.0

3
推荐指数
1
解决办法
2220
查看次数

OpenGL GLSL纹理(...)函数总是返回v4(0,0,0,1)

我有基本纹理映射的以下设置

void init(void) {
  glGenVertexArrays(NumVAOs, VAOs);
  glBindVertexArray(VAOs[Triangles]);

  GLfloat  vertices[6][2] = {
    { -0.90, -0.90 },  // Triangle 1
    {  0.85, -0.90 },
    { -0.90,  0.85 },

    {  0.1, 0.1 },  // UVs
    {  0.9,  0.1 },
    {  0.1,  0.9 }
  };

  glGenBuffers(NumBuffers, Buffers);

  glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);

  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    GLuint program = LoadShaders( "triangles.vert", "triangles.frag" );
  glUseProgram(program);

  glVertexAttribPointer(vPosition, 2, GL_FLOAT,
                        GL_FALSE, 0, BUFFER_OFFSET(0));

  glEnableVertexAttribArray(vPosition);

  glVertexAttribPointer(1, 2, GL_FLOAT,
                        GL_FALSE, 0, BUFFER_OFFSET(2*3*sizeof(GLfloat)));

  glEnableVertexAttribArray(1);

  GLuint sloc = glGetUniformLocation(program, "mySampler");
  glUniform1i(sloc, 0);

  int x,y,n; …
Run Code Online (Sandbox Code Playgroud)

opengl texture-mapping

3
推荐指数
1
解决办法
2726
查看次数

glTexSubImage2D无法正常工作

我写了一个非常简单的OpenGL应用程序.它的目标是加载纹理并将其绘制在平面上.如果我使用函数'glTexSubImage2D',则平面没有纹理,函数'glGetError'返回错误'1281'(无效值).但是,如果我使用'glTexImage2D'函数,我的平面纹理正确(我没有错误).

这是我的一段代码:

void core::RootDevice::LoadTexture(char const *pFileName)
{
    SDL_Surface *pSurface = IMG_Load(pFileName);
    char *pPixels = reinterpret_cast<char*>(pSurface->pixels);
    uint32_t bytePerPixel = pSurface->format->BitsPerPixel;

    glGenTextures(1, &textureId);
    glBindTexture(GL_TEXTURE_2D, textureId);
    {
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID);
        {
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            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_RGB, pSurface->w,       //NO ERROR : All is ok
                //pSurface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, pPixels);

            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pSurface->w,        //ERROR : 1281
                pSurface->h, GL_RGB, GL_UNSIGNED_BYTE, pPixels);

            std::cout << glGetError() << std::endl;
            getchar();
        }
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    }
    glBindTexture(GL_TEXTURE_2D, 0);
}
Run Code Online (Sandbox Code Playgroud)

并且渲染代码: …

opengl texture-mapping

3
推荐指数
1
解决办法
4152
查看次数

WebGL纹理调整大小意外输出

在WebGL中使用纹理时,有时我需要使其比原来大。当我这样做时,它会导致纹理出现不同的外观,尤其是在较浅的背景上。

我有以下图像(256 x 256):

原始图像

在WebGL中渲染时,它比原始图像稍大。图像在两种不同背景下的显示方式如下:

在此处输入图片说明 浅色背景上的图像

如您所见,图像在深色背景上正确显示,但是在浅色背景上则显示白色轮廓。

我的设置代码:

gl.clearColor(0x22 / 0xFF, 0x22 / 0xFF, 0x22 / 0xFF, 1); // set background color
gl.enable(gl.BLEND); // enable transparency
gl.disable(gl.DEPTH_TEST); // disable depth test (causes problems with alpha if enabled)
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); //set up blending
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); //clear the gl canvas
gl.viewport(0, 0, canvas.width, canvas.height); //set the viewport
Run Code Online (Sandbox Code Playgroud)

这是每次加载纹理时调用的代码:

function handleTextureLoaded(image, texture) {
  gl.bindTexture(gl.TEXTURE_2D, texture);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
  gl.generateMipmap(gl.TEXTURE_2D);
  gl.bindTexture(gl.TEXTURE_2D, null);
  loadCount++;
}
Run Code Online (Sandbox Code Playgroud)

是什么导致轮廓出现,如何解决? …

javascript textures opengl-es texture-mapping webgl

3
推荐指数
1
解决办法
991
查看次数

Three.js用THREE.TextureLoader重复纹理

我想问你是否知道如何使用THREE.TextureLoader()重复纹理.我找到了仅使用THREE.ImageUtils.loadTexture()的解决方案.这是我的代码的一部分:

var loader = new THREE.TextureLoader();
var wall;
loader.load('../images/concreteWall.jpg', function (texture) {
                        var wallMaterial = new THREE.MeshBasicMaterial({
                            map: texture
                        });
                        wall = new THREE.Mesh(sideWallsGeometry, wallMaterial);
                        scene.add(wall);
                    }
                );
Run Code Online (Sandbox Code Playgroud)

javascript texture-mapping three.js

3
推荐指数
1
解决办法
1679
查看次数