无论我做什么,我的纹理似乎都会被拉伸/缩放到我应用它们的网格的大小。我已经阅读了这个问题的很多答案,似乎没有一个解决方案可以为我解决问题,所以我发布了一个新的解决方案。只是一点信息,
这是我的代码
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) 我想知道如何在 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)
ursina引擎立方体纹理。有没有办法像搅拌机一样在 3D 表面上绘制 3D 纹理?
我在一个规则间隔的网格上有一组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) 我有一个GL_QUAD_STRIP,我是纹理映射.四边形条带自身折叠以形成UV球体.基本上,四边形条通常不是由矩形 - 而是梯形.
我遇到纹理失真问题.纹理坐标是正确的(例如,它们排列得很好).问题出在梯形面上.
我希望纹素朝着梯形面的较大一端对着较大的区域,但是面部看起来分成两个三角形.它看起来类似于仿射纹理映射(但我认为它不是;它看起来仍然是正确的,我不希望它仍然被使用).
我知道显卡通常会在内部将四边形减少为三角形,但我不希望这会影响纹理...
所以,我不知道这里发生了什么.有什么想法吗?
以下是不良行为的示例.低分辨率地球纹理,最近的过滤,没有mipmap或各向异性:

我想知道一个理论推理为什么这甚至可能:几何的转换如何与纹理映射相关.
GL_CLAMP_TO_EDGE,GL_NEAREST,片段着色器是highp.我试过的事情:
我有基本纹理映射的以下设置
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应用程序.它的目标是加载纹理并将其绘制在平面上.如果我使用函数'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)
并且渲染代码: …
在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)
是什么导致轮廓出现,如何解决? …
我想问你是否知道如何使用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) texture-mapping ×10
opengl ×5
textures ×4
javascript ×3
3d ×2
three.js ×2
c++ ×1
game-engine ×1
javafx ×1
javafx-3d ×1
opengl-es ×1
paint ×1
panda3d ×1
python ×1
webgl ×1