簡體   English   中英

紋理坐標OSG GLSL

[英]Texture Coordinates OSG GLSL

我有一張500x500像素的圖像,將其轉換為Texture2D到GLSL,然后將原始數據返回到C ++ / OSG。 我遇到了紋理坐標問題(GLSL上的坐標從0變為1)。 有人可以幫我嗎?

C ++代碼:

cv::Mat test = cv::Mat::zeros(512, 512, CV_8UC3);
test(cv::Rect(  0,   0, 255, 255)).setTo(cv::Scalar(255,0,0));
test(cv::Rect(256,   0, 255, 255)).setTo(cv::Scalar(0,255,0));
test(cv::Rect(  0, 256, 255, 255)).setTo(cv::Scalar(0,0,255));
test(cv::Rect(256, 256, 255, 255)).setTo(cv::Scalar(255,255,255));

osg::ref_ptr<osg::Image> image = new osg::Image;
image->setImage(512, 512, 3, GL_RGB, GL_BGR, GL_UNSIGNED_BYTE, test.data, osg::Image::NO_DELETE, 1);

osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
texture->setTextureSize(512, 512);
texture->setImage(image);

// Pass the texture to GLSL as uniform
osg::StateSet* ss = scene->getOrCreateStateSet();

osg::Uniform* samUniform = new osg::Uniform(osg::Uniform::SAMPLER_2D, "vertexMap");
samUniform->set(0);
ss->addUniform(samUniform);
ss->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);

頂點代碼:

#version 130

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
}

片段代碼:

#version 130

uniform sampler2D vertexMap;
out vec4 out_data;

void main() {
    vec3 value = texture2D(vertexMap, gl_TexCoord[0].st).xyz;
    out_data = vec4(value, 1);
}

這是我的輸入數據:

輸入數據

着色器的輸出數據:

在此處輸入圖片說明

我通過在片段着色器texture2D texelFetch替換為texture2D來解決。 這兩個函數之間的區別可以在這里找到: https : //gamedev.stackexchange.com/questions/66448/how-do-opengls-texelfetch-and-texture-differ

#version 130

uniform sampler2D vertexMap;

out vec4 out_data;

void main() {
    vec3 value = texelFetch(vertexMap, ivec2(gl_FragCoord.xy), 0).xyz;
    out_data = vec4(value, 1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM